Gibt es einen Grund, warum dieser Code nicht kompiliert wird:Warum konnte der Compiler den Typ 'a == a' nicht mit 'True' für die Typfamilie vergleichen?
type family Foo a b :: Bool where
Foo a b = a == b
foo :: Foo a b ~ True => Proxy a -> Proxy b
foo _ = Proxy
bar :: Proxy a -> Proxy a
bar = foo
mit Fehler:
Couldn't match type ‘a == a’ with ‘'True’
Expected type: 'True
Actual type: Foo a a
aber wenn ich Typ Familie Definition
type family Foo a b :: Bool where
Foo a a = True
Foo a b = False
es kompiliert gut ändern?
(GHC-7.10.3)
Wo ist die Typfamilie '==' definiert? Wird es von Instanzen automatisch von GHC aufgehoben? Wenn dies der Fall ist, muss GHC die Möglichkeit einer merkwürdigen Instanz berücksichtigen, bei der bei einem benutzerdefinierten Typ '(==) = \ _ _ -> False', denke ich. – chi
Können Sie ein vollständiges Arbeitsbeispiel hinzufügen? Wenn ich Ihr Beispiel versuche, erhalte ich andere Fehler als die, die Sie gezeigt haben. –
@chi, oder nicht seltsam: '(Lassen Sie x = 0/0 in x == x) ~> False'. – user3237465