Czy jest jakiś powód, dlaczego ten kod nie jest kompilowany:Dlaczego kompilator nie mógł dopasować typu "a == a" z "True" dla rodziny typów?
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
z błędem:
Couldn't match type ‘a == a’ with ‘'True’
Expected type: 'True
Actual type: Foo a a
ale jeśli mogę zmienić definicję rodziny typ do
type family Foo a b :: Bool where
Foo a a = True
Foo a b = False
jest kompilowany dobrze?
(ghc-7.10.3)
Gdzie jest zdefiniowana rodzina typów "=="? Czy jest automatycznie usuwany z instancji przez GHC? Jeśli tak, GHC musi liczyć się z możliwością dziwnego przypadku, w którym na jakiś niestandardowy typ '(==) = \ _ _ -> False', tak myślę. – chi
Czy możesz podać pełny przykład działania? Kiedy próbuję twojego przykładu, dostaję różne błędy niż ten, który pokazałeś. –
@chi, lub nie dziwne: '(niech x = 0/0 na x == x) ~> Fałsz. – user3237465