我正在尝试将字符串与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 回答
你将括号括起来并在
Char.contains
的参数之间放一个逗号的方式表明你在理解像Char.contains
这样的函数是否有效方面有些麻烦 . 这些函数称为curried函数,如果将它们视为两个变量的函数,则会产生一些误导 .Char.contains是
string -> char -> bool
类型的函数 . 输入类型是字符串,其输出类型是char -> bool
类型的函数 . 通常会立即评估此输出函数:您可能看起来正在评估2个变量的函数,但实际上您正在评估1个变量的2个函数:函数
Char.contains
在"cat"
处被重新调整以返回char -> bool
类型的函数,后面的函数被评估为#"a"
以获得最后结果 .请注意,可以使用
Char.contains
返回未立即求值的函数 . 例如:这里
isVowel
是一个函数,可用于检查(小写)字符是否是元音 .List.all
是('a -> bool) -> 'a list -> bool
类型的函数 . 要使用它来检查所有元素是否满足给定类型的列表(例如char
),您需要传递一个函数,该函数接受该类型的元素并返回一个布尔值(例如char -> bool
类型的函数;但是 - 我们已经知道如何制造
char -> bool
型的功能:使用Char.contains
. 对于任何字符串s
,Char.contains s
是一个可以传递给List.all
的函数,然后将结果函数应用于字母表中的字符列表:Char.contains s
括在括号中的原因是因为函数求值是左关联的 . 如果没有括号,SML会将其解析为(List.all Char.contains) s
,这没有任何意义 .