2013-02-10 203 views
1

我想了解Haskell的基礎知識,我很難理解爲什麼doubleMe類型聲明會導致「非法操作符」錯誤,而addThree根本不會導致任何錯誤?Haskell函數類型

doubleMe :: Int -> Int -> Int 
doubleMe x = x + x 


addThree :: Int -> Int -> Int -> Int 
addThree x y z = x + y + z 

我很感激任何澄清。

許多在此先感謝。

回答

5

該聲明要求每個參數的類型以及結果的類型。由於doubleMe只有一個參數,因此聲明應爲doubleMe :: Int -> Int

+0

哦!我懂了。所以如果我在做'doubleMe x = x + x + x + y',那麼類型聲明就是'doubleMe :: Int - > Int - > Int' – AnchovyLegend 2013-02-10 16:50:21

+3

是的,但是您也必須在'='的左側添加'y';否則你會得到一個錯誤。 – 2013-02-10 16:55:32

+0

謝謝!很有幫助! – AnchovyLegend 2013-02-10 17:28:03

2

您的doubleMe類型簽名指定了兩個參數。

如果僅提供一個爲是(doubleMe x),那麼右邊應當返回一個函數(Int -> Int

1

對於此類問題ghci是一個偉大的工具。使用:t要求一個表達式的類型:

Prelude> let doubleMe x = x + x 
Prelude> :t doubleMe 
doubleMe :: Num a => a -> a 

因此類型a -> a - 你只有一個參數,而不是兩個,因爲其他的答案已經指出。

您沒有得到Int,因爲Haskell試圖推導出最常用的類型簽名。這就是爲什麼你Num a =>代替,這意味着doubleMe將所有類型的a這是Num型類(其中(+)定義),這反過來又意味着doubleMe作品Int的情況下,IntegerDouble工作(至少如果你不要指定更具限制性的類型,如Int -> Int)...