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
。对于任何字符串 s
, Char.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
,这没有意义。
我正在尝试使用 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
。对于任何字符串 s
, Char.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
,这没有意义。