2017-02-15 60 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