String SML包含使用字符串和字符列表
我试图使用REPL将字符串与SML中的字符列表进行比较,我有以下几点:String SML包含使用字符串和字符列表,string,function,contains,sml,string-comparison,String,Function,Contains,Sml,String Comparison,我试图使用REPL将字符串与SML中的字符列表进行比较,我有以下几点: val alphabet = "abcdefghijklmnopqrstuvwxyz"; val charalphabet = explode alphabet; val str = "the quick brown fox"; val res = Char.contains(str, charalphabet); 这会引发错误,因为我试图将字符串与字符列表进行比较,而contains仅将字符串与单个字符进行比较。有人知道
val alphabet = "abcdefghijklmnopqrstuvwxyz";
val charalphabet = explode alphabet;
val str = "the quick brown fox";
val res = Char.contains(str, charalphabet);
这会引发错误,因为我试图将字符串与字符列表进行比较,而contains仅将字符串与单个字符进行比较。有人知道如何解决这个问题吗?我可以分解字符串str并比较字符列表,但是我不确定它们是否是用于此的函数。因此,如果有人对我可以读懂的函数或内容有任何想法,请告诉我,目的是查看字符串是否包含每个已定义的字符列表
我是SML的新手,非常感谢您的帮助 在
Char.contains
的参数之间加括号和逗号的方式表明,您在理解像Char.contains
这样的函数如何工作时遇到了一些困难。这类函数称为curried函数,如果将它们视为两个变量的函数,则有点误导
Char.contains是类型为string->Char->bool
的函数。输入类型是字符串,输出类型是char->bool
类型的函数。通常情况下,会立即计算此输出函数:
- Char.contains "cat" #"a";
val it = true : bool
这可能看起来像是在计算一个包含两个变量的函数,但实际上是在计算一个变量的两个函数:函数Char.contains
在“cat”
处求值,以返回一个类型为Char->bool
的函数,后一个函数在#“a”处求值
以获得最终结果
请注意,可以使用Char.contains
返回未立即计算的函数。例如:
val isVowel = Char.contains "aeiou";
这里的isVowel
是一个函数,可用于检查(小写)字符是否为元音
List.all
是类型为('a->bool)->'a List->bool
的函数。要使用它检查给定类型(例如char
)的列表是否满足属性,需要向其传递一个函数,该函数接受该类型的元素并返回布尔值(例如char->bool
)类型的函数
但是--我们已经知道如何制造char->bool
类型的函数:使用char.contains
。对于任何字符串s
,char.contains s s
是一个可以传递到列表的函数。所有以及应用于字母表中字符列表的结果函数:
val alphabet = explode "abcdefghijklmnopqrstuvwxyz";
fun isPanagram s = List.all (Char.contains s) alphabet;
Char.contains s
被括在括号中的原因是函数求值是左关联的。如果没有括号,SML会将其解析为
(List.all Char.contains)s
,这毫无意义。你的字母表中缺少wxyz
有什么原因吗?在任何情况下:提示1:List.all
都很有用。提示2:Char.contains str
是Char->bool
类型的函数。我编辑了这篇文章,缺少的“wxyz”是我的打字错误。我将研究你刚才提到的两件事。今天早些时候我使用的函数是:fun isPangram c=if Char.contains(c,charalphabet)那么true else false;是否在正确的轨道上,即使它不工作?是的,它在正确的轨道上,因为Char.contains
是作业的自然工具,您知道当前代码的问题所在。但是请注意Char.contains
是一个常用函数,所以在输入周围加上括号这是不对的,所以除了char vs.char list问题之外,还有另一个问题。我认为插入括号是不相关的,是为了美观,但我想我错了。那么,是否可以定义我自己的contains函数来检查字符串是否包含字母表和retu中的所有字符rns是否正确?是的,您可以定义所需内容,但有一行定义使用List.all和Char.contains。非常感谢您的深入响应/解释。通过您建议的一些更改,我的函数运行得非常好。再次感谢您坚持我的观点,并花时间将所有内容解释得如此好!