我正在尝试将字符串与SML中的Charlist进行比较,使用REPL我有:
val alphabet = "abcdefghijklmnopqrstuvwxyz";
val charalphabet = explode alphabet;
val str = "the quick brown fox";
val res = Char.contains(str, charalphabet);
这会引发错误,因为我试图将String与Charlist进行比较,并且只包含将String与单个Char进行比较。有没有人有任何想法如何解决这个问题?我可以爆炸String str并比较Char列表但是我不确定它们是否是这个函数。因此,如果有人对我可以阅读的函数或事物有任何想法请告诉我,目标是查看String是否包含每个定义的Charlist。
我对SML非常陌生,所以非常感谢任何帮助!
答案 0 :(得分:1)
将括号括起来并在Char.contains
的参数之间添加逗号的方式表明您在理解Char.contains
等函数的工作方式时遇到了一些麻烦。这些函数称为curried函数,如果将它们视为两个变量的函数,则会产生一些误导。
Char.contains是string -> char -> bool
类型的函数。输入类型是字符串,其输出类型是类型char -> bool
的函数。通常会立即评估此输出函数:
- Char.contains "cat" #"a";
val it = true : bool
您可能看起来正在评估2个变量的函数,但实际上您正在评估1个变量的2个函数:函数Char.contains
在"cat"
处被重新调用以返回类型为{的函数{1}}并且后一个函数被评估为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
的函数,然后将结果函数应用于字母表中的字符列表:
List.all
括号中包含val alphabet = explode "abcdefghijklmnopqrstuvwxyz";
fun isPanagram s = List.all (Char.contains s) alphabet;
的原因是因为函数评估是左关联的。如果没有括号,SML会将其解析为
Char.contains s
,这没有任何意义。