2017-10-09 61 views
1

我最近開始學習Haskell,並且遇到了字典問題。我使用一個鍵從字典中獲取整數,GHCi在字符串中使用第一個元素作爲字典的鍵時,打印出一個錯誤「無法與類型Char匹配[Char]」。下面是代碼:無法將類型Char與[Char]匹配,Haskell

import Data.Map 
mapRomantoInt :: Map String Int 
mapRomantoInt = fromList[("I",1),("V",5),("IX",9),("X",10),("L",50),("C",100),("D",500),("M",1000)] 

romanToInt :: String -> Int 
romanToInt _ = 0 
romanToInt c = if length c == 1 then mapRomantoInt ! head c else 
         let first = mapRomantoInt ! head c 
          second = mapRomantoInt ! (c !! 1) 
          others = romanToInt(tail c) 
         in if first < second then others - first else others + first 
+0

'頭部c'是一個字符。改用'[head c]'。與c一樣! 1':應該是[c !! 1]'。 –

+1

請注意,這種編程風格效率低下('長度'掃描整個列表),危險的(像head,tail,!!這樣的函數會在列表太短時使程序崩潰)和不正確的('romanToInt',如書面所示,總是返回'0')。我強烈建議你避免這種非慣用風格,並嘗試利用模式匹配,這是更安全和更習慣。 – chi

回答

2

在Haskell,String[Char]的代名詞。

c in romanToInt的類型爲String,即[Char]

head的類型爲[a] -> a,所以head c的類型爲Char

(!)的類型是Ord k => Map k a -> k -> a。在這種情況下,mapRomantoInt的類型爲Map String Int,因此k必須是String

但函數調用mapRomantoInt ! head c試圖通過Char而不是[Char]String)。

OP中的代碼還存在其他問題,但首先嚐試修復編譯錯誤。

+0

感謝您的回答!我已經改變了頭c到[頭c],它完美的工作! – ProPall

相關問題