將括號括起來並在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
對於任何字符串s
,Char.contains s
是可以傳遞給List.all
,然後應用到字母字符的列表中得到的函數的函數。
val alphabet = explode "abcdefghijklmnopqrstuvwxyz";
fun isPanagram s = List.all (Char.contains s) alphabet;
原因括號中包含是因爲函數評估是左關聯的。沒有括號,SML會將其解析爲 (List.all Char.contains) s
,這沒有任何意義。
是否有任何原因你的字母表中缺少'wxyz'?無論如何:提示1:'List.all'很有用。提示2:'char.contains str'是'char - > bool'類型的函數。 –
我編輯了帖子,失蹤的「wxyz」是我的錯字。我將研究你剛剛提到的兩件事。我今天早些時候使用的函數是:fun isPangram c = if Char。包含(c,charalphabet)then true else false;即使它不工作,它是否正確? – firetiger443
是的,它正處於正確的軌道上,因爲'Char.contains'是工作的天然工具,並且您知道當前代碼存在什麼問題。但請注意,'Char.contains'是一個curried函數,所以在輸入框中加上括號是不正確的,所以除了char和char列表問題之外,還有其他問題。 –