首页 文章

SML包含使用String和Charlist

提问于
浏览
2

我正在尝试将字符串与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 回答

  • 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" 处被重新调整以返回 char -> bool 类型的函数,后面的函数被评估为 #"a" 以获得最后结果 .

    请注意,可以使用 Char.contains 返回未立即求值的函数 . 例如:

    val isVowel = Char.contains "aeiou";
    

    这里 isVowel 是一个函数,可用于检查(小写)字符是否是元音 .

    List.all('a -> bool) -> 'a list -> bool 类型的函数 . 要使用它来检查所有元素是否满足给定类型的列表(例如 char ),您需要传递一个函数,该函数接受该类型的元素并返回一个布尔值(例如 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 括在括号中的原因是因为函数求值是左关联的 . 如果没有括号,SML会将其解析为 (List.all Char.contains) s ,这没有任何意义 .

相关问题