SML包含使用字符串和Charlist

时间:2017-02-15 20:20:22

标签: string function contains sml string-comparison

我正在尝试将字符串与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非常陌生,所以非常感谢任何帮助!

1 个答案:

答案 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"; 是一个函数,可用于检查(小写)字符是否为元音。

isVowelList.all类型的函数。要使用它来检查所有元素是否满足给定类型的列表(例如('a -> bool) -> 'a list -> bool)满足属性,您需要传递一个函数,该函数接受该类型的元素并返回一个布尔值(例如,输入char;

但是 - 我们已经知道如何制作char -> bool类型的函数:使用char -> bool。对于任何字符串Char.containss是一个可以传递给Char.contains s的函数,然后将结果函数应用于字母表中的字符列表:

List.all

括号中包含val alphabet = explode "abcdefghijklmnopqrstuvwxyz"; fun isPanagram s = List.all (Char.contains s) alphabet; 的原因是因为函数评估是左关联的。如果没有括号,SML会将其解析为 Char.contains s,这没有任何意义。