2014-12-27 7 views
8

Ich habe um mit der fix Funktion durcheinander, und ich über das passiert ist:Die Bedeutung von Tilde in Haskell-Typen (Typ Gleichheit)

λ 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 (+) 

Ich weiß sehr wohl, warum dieser Fehler auftritt, aber ich bemerkte eine lustige Signatur dort oben: t ~ t -> t. Was bedeutet dieser Typ? Was bedeuten Tilde in Typ-Signaturen innerhalb von Haskell? Wo werden sie benutzt?

Antwort

10

Tilde (~) in diesem Fehler bedeutet Typ Gleichheit. Es sagt Ihnen, dass t nicht t -> t sein kann. Das Symbol wird auch für irrefutable patterns verwendet, aber das ist ein ganz anderer Kontext.

+0

Wo würde es verwendet werden, ohne Typfehler? – AJFarmar

+5

@AJFarmar Mit der 'TypeFamilies'-Erweiterung können Sie' ~ 'in Ihren eigenen Typ-Signaturen verwenden, um die Typgleichheit zu definieren, so wie es in dieser Fehlermeldung verwendet wird. Es ist etwas, das Sie bei der Arbeit mit Typ-Synonym-Familien finden, aber es kann nützlich sein, um verschiedene Tricks auf Typenebene zu machen (das eine Beispiel von oben): Sie können "Standard" -Instanzen einer Klasse mit 'bekommen OverlappingInstances' mit 'instance Foo X' und' instance (y ~ Y) => Foo y') – jberryman