2014-12-27 77 views
8

我已經與fix功能瞎搞,我正好碰到這個:代字號在Haskell類型(類型相等)的含義

λ let fix f = let x = f x in x 
λ fix (+) 

<interactive>:15:5: 
    Occurs check: cannot construct the infinite type: t ~ t -> t 
    Expected type: t -> t 
     Actual type: t -> t -> t 
    Relevant bindings include it :: t (bound at <interactive>:15:1) 
    In the first argument of ‘fix’, namely ‘(+)’ 
    In the expression: fix (+) 

我清楚地知道,爲什麼這個錯誤發生,但我在那裏注意到一個有趣的類型簽名:t ~ t -> t。這種類型是什麼意思? haskell中的類型簽名是什麼意思?他們在哪裏使用?

回答

10

Tilde(~)中的錯誤代表類型相等。它告訴你,它不能推斷tt -> t。該符號也用於irrefutable patterns,但這是完全不同的上下文。

+0

去哪裏使用它,不包括類型錯誤? – AJFarmar 2014-12-27 13:31:02

+5

@AJFarmar'TypeFamilies'擴展允許您在自己的類型簽名中使用'〜'來表示類型相等,與在此錯誤消息中使用的方式相同。當你使用類型同義詞族時,你會發現它是你想要的東西,但是對於做各種類型級別的技巧(這是我頭頂的一個例子:你可以用' OverlappingInstances'與'實例Foo X'和'instance(y〜Y)=> Foo y') – jberryman 2014-12-27 21:44:37