2017-07-14 42 views
0

我最近開始學習Haskell和我的程序我收到以下錯誤:哈斯克爾:預計類型:[字符]實際類型:[[字符]

Couldn't match type ‘[Char]’ with ‘Char’ 
Expected type: [Char] 
    Actual type: [[Char]] 
In the first argument of ‘head’, namely ‘input’ 
In the first argument of ‘magi’, namely ‘(head input)’ 

我的代碼如下所示:

vocals = ["a", "e", "i", "o", "u","y"] 
vocal o 
    | elem o vocals == True = True --return true if the letter is a vowel 
    | elem o vocals == False = False --else false 

magi konsonant = [konsonant] ++ "o" ++ [konsonant] 

rovarsprak input 
    |length input == 0 = "" 
    |length input > 0 && vocal (head input) == False = magi (head input) ++ rovarsprak (tail input) 
    |length input > 0 && vocal (head input) == True = head input : rovarsprak (tail input) 

據我所知,我得到的錯誤是因爲我的輸入頭部函數是[[]]而不是[字符],但我不明白爲什麼頭部輸入是[[char ]。 謝謝!

回答

4

的問題是,vocal具有類型:

vocal :: String -> Bool

這是因爲vocalsString小號一個列表,從而elem將在這裏檢查,如果一個字符串是在字符串列表。

因此Haskell得出的結論是,既然您撥打vocal (head input),input本身應該是String的列表。

我們可以很容易地改變這一到:

vocals = ['a', 'e', 'i', 'o', 'u', 'y']

或更短:

vocals = "aeiouy"

話雖這麼說,你的代碼是相當混亂的。如下

vocals :: [Char] 
vocals = "aeiouy" 

vocal :: Char -> Bool 
vocal = flip elem vocals     -- pointfree function 

magi :: Char -> String 
magi konsonant = konsonant : 'o' : [konsonant] 

rovarsprak :: String -> String 
rovarsprak "" = ""       -- use patterns 
rovarsprak (h:t)       -- use patterns to unpack 
    | vocal h = h : rovarsprak t   -- == True is not necessary 
    | otherwise = magi h ++ rovarsprak t -- use otherwise 

vocal = flip elem vocals作品:我們可以把它改寫成flip需要輸入一個函數f有兩個參數xy。然後它變成一個函數,它帶有兩個參數yx(所以參數被翻轉)。

我們想要的是撥打elem o vocals。這相當於flip elem vocals o。現在通過使用eta -reduction,我們可以省略o(在子句的頭部和正文中)。

+0

謝謝你的回答! 但是我不太清楚'vocal = flip elem vocals'這一行是做什麼的? – Sequinex