2017-02-15 87 views
2

我想一个字符串比较的SML一Charlist,使用REPL我有这样的:SML包含使用字符串和Charlist

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

此抛出,因为我想一个字符串比较错误Charlist,并且仅包含将字符串与单个Char进行比较。有没有人有任何想法如何解决这个问题?我可以爆炸String str并比较Char列表,​​但是我不确定它们是否是一个函数。因此,如果任何人有任何关于我可以阅读的函数或事物的想法,请让我知道,目标是查看一个字符串是否包含每个定义的Charlist。

我对SML非常新,所以任何帮助都非常感谢!

+0

是否有任何原因你的字母表中缺少'wxyz'?无论如何:提示1:'List.all'很有用。提示2:'char.contains str'是'char - > bool'类型的函数。 –

+0

我编辑了帖子,失踪的“wxyz”是我的错字。我将研究你刚刚提到的两件事。我今天早些时候使用的函数是:fun isPangram c = if Char。包含(c,charalphabet)then true else false;即使它不工作,它是否正确? – firetiger443

+0

是的,它正处于正确的轨道上,因为'Char.contains'是工作的天然工具,并且您知道当前代码存在什么问题。但请注意,'Char.contains'是一个curried函数,所以在输入框中加上括号是不正确的,所以除了char和char列表问题之外,还有其他问题。 –

回答

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"被evalauted返回类型为char -> bool的函数,并且对后者函数进行求值以得到最终结果。

请注意,有可能使用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; 

原因括号中包含是因为函数评估是左关联的。没有括号,SML会将其解析为 (List.all Char.contains) s,这没有任何意义。

+0

非常感谢您的深入回复/解释。随着您推荐的一些更改,我的功能完美无缺。再次感谢您坚持和我花时间解释一切! – firetiger443