2013-04-07 50 views
5

我開始學習Haskell與「學習你一個好主意的Haskell!」我犯了一個奇怪的錯誤,我找不到原因。函數定義在Haskell

這裏是我輸入的代碼:

let xs = [if x < 3 then "bang" else "boom" | x <- xs] 

而且在GHCI了錯誤的文字:

No instance for (Num [Char]) 
arising from the literal `3' 
Possible fix: add an instance declaration for (Num [Char]) 
In the second argument of `(<)', namely `(3)' 
In the expression: x < (3) 
In the expression: if x < (3) then "bang" else "boom" 

但是,當我鍵入:

let boom xs = [if x < 3 then "bang" else "boom" | x <- xs] 

這是這本書的例子,我沒有任何問題。

有人能解釋我的錯誤嗎?

+0

感謝你們的答案;它們相輔相成。 – guillaume8375 2013-04-07 20:46:26

回答

7

嘗試給表達式一個類型。

xs = [if x < 3 then "bang" else "boom" | x <- xs] 

所以xs是一個列表,我們還不知道什麼類型的元素都有,所以讓我們來看看,明年。列表中的元素是

if x < 3 then "bang" else "boom" 

其是String類型(又名[Char])的表達。

因此xs :: [String]。由於從描述列表元素表達的x從列表xs本身採取,它是一個String過了,在比較時使用現在

if x < 3 

3是一個整數文字,因此它是多晶型和已鍵入

3 :: Num a => a 

所以從表達x < 3,我們有

  • Num約束來自文字,
  • 類型String來自x是從String s列表中抽取的事實。

因此,我們需要一個String例如Num有一個良好的輸入表達式。

通常,String沒有Num實例(有用的實例是什麼?),所以你會得到一個類型錯誤。

如果xs是函數的參數,

boom xs = [if x < 3 then "bang" else "boom" | x <- xs] 

沒有理由的x的類型應該是String,因此工程。

+0

感謝你們的答案;它們相輔相成。 – guillaume8375 2013-04-07 20:47:20

13

您對xs的定義是遞歸的,即您在自己的定義中使用了xs。我不認爲這就是你的意圖。

由於您使用"bang""boom"列表內涵中,哈斯克爾知道xs必須是字符串列表(因爲xs等於列表解析的結果)。此外,您說xxsx <- xs)的元素,因此x必須是字符串(又名[Char])。但是你做x < 3,這意味着x是一個數字。錯誤消息的意思是「一個字符串不是一個數字」。

+0

織補,打我幾秒鐘.. +1 – jozefg 2013-04-07 20:32:37

+0

類型錯誤的簡潔說明 – Wes 2013-04-07 20:43:34

0
let xs = ... 

裝置XS等於「砰」的S和/或「轟」 S清單,但條件是:這些元素應該< 3,這通常是用數字,而不是字符串進行測試。

let boom xs =... 

等同於公式,其中,參數「XS」是列表,從中爲< 3待測試的分子被吸收的右手側上的功能「潮」。