2013-03-30 43 views
3

我一直在搜索,找到答案,甚至來到這裏提出的幾個問題。這似乎是一個模棱兩可的錯誤,我無法弄清楚在我的例子中如何解決它。類型簽名缺少適當的綁定[Haskell]

有問題的代碼如下:

pos :: (Eq a) => [a] -> a -> Int 
pos [] _ = -1 
pos (x:xs) y 
| not $ elem y (x:xs) = -1 
| x == y = 0 
| otherwise = 1 + pos xs y 

-- Get the same element from another range as one element of the first range. 
refPos :: (Eq a) => [a] -> [b] -> a -> b 
refPos r1 r2 e1 = r2 !! (r1 `pos` e1) 

letterNumber :: (Eq a, Char a) => a -> Int 
lettNumber x = refPos ['a'..'z'] [0..25] x 

確切的錯誤的文本是:

15:letterNumber 1所述的類型簽名缺少伴隨結合。

原來我放的類型簽名是Char-> Int,但那不起作用(它說了一些關於Eq的內容,但我也是新的,Haskell也正確地解釋它)。所以我改變了類型簽名以具有Eq類的約束。如果有人能指出什麼是錯誤的或解決方法,那將是非常感謝,因爲這是我正在開展的一個項目的門檻問題。

+2

這個錯誤幾乎總是在我的經驗,一個函數名稱的拼寫錯誤!這很偶然,因爲我忘了寫函數定義。 – AndrewC

回答

5

您提供了letterNumber的類型簽名,但隨後爲lettNumber提供了綁定。請注意缺失的er

只需將lettNumber重命名爲letterNumber即可匹配類型簽名中的拼寫。


而且,letterNumber正確的類型簽名是

letterNumber :: Char -> Int 
+0

這就是爲什麼我應該使用IDE。很遺憾,我花了幾個小時查看技術文檔,甚至是REWRITING函數,但沒有找到它。我現在感覺不好。謝謝。 –

+1

無論是否有IDE,我都會做得更加愚蠢。唯一愚蠢的就是放棄。這是我在vim中的IDE設置。 https://gist.github.com/gertcuykens/1171609 –