我想了解Haskell的基礎知識,我很難理解爲什麼doubleMe
類型聲明會導致「非法操作符」錯誤,而addThree
根本不會導致任何錯誤?Haskell函數類型
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
我很感激任何澄清。
許多在此先感謝。
我想了解Haskell的基礎知識,我很難理解爲什麼doubleMe
類型聲明會導致「非法操作符」錯誤,而addThree
根本不會導致任何錯誤?Haskell函數類型
doubleMe :: Int -> Int -> Int
doubleMe x = x + x
addThree :: Int -> Int -> Int -> Int
addThree x y z = x + y + z
我很感激任何澄清。
許多在此先感謝。
該聲明要求每個參數的類型以及結果的類型。由於doubleMe
只有一個參數,因此聲明應爲doubleMe :: Int -> Int
。
您的doubleMe類型簽名指定了兩個參數。
如果僅提供一個爲是(doubleMe x
),那麼右邊應當返回一個函數(Int -> Int
)
對於此類問題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
的情況下,Integer
,Double
工作(至少如果你不要指定更具限制性的類型,如Int -> Int
)...
哦!我懂了。所以如果我在做'doubleMe x = x + x + x + y',那麼類型聲明就是'doubleMe :: Int - > Int - > Int' – AnchovyLegend 2013-02-10 16:50:21
是的,但是您也必須在'='的左側添加'y';否則你會得到一個錯誤。 – 2013-02-10 16:55:32
謝謝!很有幫助! – AnchovyLegend 2013-02-10 17:28:03