2014-12-27 19 views
8

Byłem pałować z funkcją fix, a ja się po drugiej stronie to:Znaczenie tyldy w Haskell typy (równości Type)

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

dobrze wiem, dlaczego ten błąd występuje, ale zauważyłem tam zabawny podpis: t ~ t -> t. Co oznacza ten typ? Co oznacza tylda w podpisach typu w haskell? Gdzie są one używane?

Odpowiedz

10

Tilde (~) w tym błędzie oznacza typ równości. Mówi ci, że nie można wywnioskować, że t ma być t -> t. Symbol jest również używany w przypadku irrefutable patterns, ale jest to zupełnie inny kontekst.

+0

Gdzie byłby używany, nie licząc błędów? – AJFarmar

+5

@AJFarmar Rozszerzenie 'TypeFamilies' pozwala używać' ~ 'we własnoręcznych sygnaturach do oznaczania równości typów, w taki sam sposób, w jaki jest używany w tym komunikacie o błędzie. Jest to coś, czego szukasz podczas pracy z rodzinami synonimów typów, ale może być użyteczne samodzielnie do wykonywania różnych sztuczek na poziomie (jeden przykład z mojej głowy: możesz uzyskać "domyślne" wystąpienia klasy z ' OverlappingInstances' za pomocą 'instance Foo X' i' instance (y ~ Y) => Foo y') – jberryman