2014-09-16 47 views
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

+0

W jaki sposób (ID()) ocenia się na cokolwiek? Nie ma przykładów dla rodziny identyfikatorów. – augustss

+0

Napisałem go jako rodzinę typu zamkniętego (http://www.haskell.org/haskellwiki/GHC/Type_families#Closed_family_simplification) –

+0

Zapisanie go jako normalnej rodziny typów nie powoduje zmiany błędu. –

Odpowiedz

2

Problemem jest to rodzaj ConstID.

type family ConstID t a where 
    ConstID t a = ID a