SML 包含使用字符串和字符列表

SML Contains using a String and Charlist

我正在尝试使用 REPL 将字符串与 SML 中的字符列表进行比较,我有这个:

val alphabet = "abcdefghijklmnopqrstuvwxyz";
val charalphabet = explode alphabet;
val str = "the quick brown fox";
val res = Char.contains(str, charalphabet);

这会引发错误,因为我正在尝试将字符串与字符列表进行比较,而包含仅将字符串与单个字符进行比较。有没有人知道如何解决这个问题?我可以分解 String str 并比较 Char 列表,但是我不确定它们是否是一个函数。因此,如果有人对我可以阅读的函数或事物有任何想法,请告诉我,目标是查看字符串是否包含每个定义的 Charlist。

我对 SML 非常陌生,非常感谢任何帮助!

你在 Char.contains 的参数之间加上括号和逗号的方式表明你在理解 Char.contains 等函数的工作原理时遇到了一些困难。此类函数称为柯里化函数,如果您将它们视为两个变量的函数,则有点误导。

Char.contains 是 string -> char -> bool 类型的函数。输入类型是字符串,输出类型是char -> bool类型的函数。通常立即评估此输出函数:

- Char.contains "cat" #"a";
val it = true : bool

这可能看起来像您正在评估 2 个变量的函数,但实际上您正在评估 1 个变量的 2 个函数:函数 Char.contains"cat" 到 return 处被评估] 类型为 char -> bool 的函数,后一个函数在 #"a" 处被求值以获得最终结果。

请注意,可以使用 Char.contains 到 return 一个 立即求值的函数。例如:

val isVowel = Char.contains "aeiou";

此处isVowel是一个函数,可用于检查(小写)字符是否为元音。

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

类型的函数

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

val alphabet = explode "abcdefghijklmnopqrstuvwxyz";
fun isPanagram s = List.all (Char.contains s) alphabet;

Char.contains s 被括在括号中的原因是因为函数评估是 left-associative。如果没有括号,SML 会将其解析为 (List.all Char.contains) s,这没有意义。