9
Znalazłem interesującą sytuację przy korzystaniu z typów danych z rodzinami typów.Rodzinne aplikacje typu Haskell nie są oceniane
Komunikat o błędzie kompilatora: No instance for (C (ID())) arising from a use of W
. Sugeruje to, że aplikacja rodzinna typu nie jest w pełni oceniana, nawet gdy jest nasycona. :kind! ID()
ma wartość ()
, więc należy użyć instancji C()
.
{-# LANGUAGE GADTs, TypeFamilies, UndecidableInstances, FlexibleContexts #-}
type family ID t where
ID t = t
class C t where
instance C() where
data W where
W :: C (AppID t) => P t -> W
type family AppID t where
AppID t = (ConstID t)()
type family ConstID t where
ConstID t = ID
data P t where
P :: P t
data A
w :: W
w = W (P :: P A)
Czy mogę jakoś wymusić ocenę ID()
? Czy jest to błąd kompilatora?
Używam GHC 7.8.3
W jaki sposób (ID()) ocenia się na cokolwiek? Nie ma przykładów dla rodziny identyfikatorów. – augustss
Napisałem go jako rodzinę typu zamkniętego (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –
Zapisanie go jako normalnej rodziny typów nie powoduje zmiany błędu. –