将括号括起来并在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"
被evalauted返回类型为char -> bool
的函数,并且对后者函数进行求值以得到最终结果。
请注意,有可能使用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会将其解析为 (List.all Char.contains) s
,这没有任何意义。
是否有任何原因你的字母表中缺少'wxyz'?无论如何:提示1:'List.all'很有用。提示2:'char.contains str'是'char - > bool'类型的函数。 –
我编辑了帖子,失踪的“wxyz”是我的错字。我将研究你刚刚提到的两件事。我今天早些时候使用的函数是:fun isPangram c = if Char。包含(c,charalphabet)then true else false;即使它不工作,它是否正确? – firetiger443
是的,它正处于正确的轨道上,因为'Char.contains'是工作的天然工具,并且您知道当前代码存在什么问题。但请注意,'Char.contains'是一个curried函数,所以在输入框中加上括号是不正确的,所以除了char和char列表问题之外,还有其他问题。 –