data Zero = Zero
data Succ x = Succ x
class NatToPeano a b | a -> b where
toPean :: b
instance NatToPeano 0 Zero where toPean = Zero
instance (NatToPeano (x-1) a) => NatToPeano x (Succ a) where
toPean = Succ (toPean @(x-1))
Isso produz o erro:
Functional dependencies conflict between instance declarations:
instance NatToPeano 0 Zero -- Defined at parsejava.hs:26:10
instance NatToPeano (x - 1) a => NatToPeano x (Succ a)
-- Defined at parsejava.hs:28:10
26 | instance NatToPeano 0 Zero where
Conforme a resposta de @Noughtmare, você provavelmente não consegue fazer exatamente o que está tentando fazer aqui. Para uma solução abrangente para a conversão entre números naturais de nível de tipo GHC e números Peano de nível de tipo, considere o pacote type-natural , que utiliza muitos truques para acertar isso e fornecer o maquinário apropriado para torná-lo realmente utilizável.
O mais próximo que você pode chegar com seu código atual é definir uma família de tipos para converter os tipos naturais do GHC em sua representação Peano somente no nível de tipo:
e então introduzir uma classe para gerar números Peano de nível de termo a partir de seu tipo:
Isso permitirá que você defina uma função:
que usa a
ToPeano
família de tipos para calcular o tipo Peano apropriado a partir do GHC natural e, em seguida, apeano
função de classe de tipo para gerar o valor Peano de nível de termo para o tipo Peano, então você pode escrever:Isso pode ser o que você queria, mas é difícil dizer se realmente funcionará na sua aplicação real.
O código completo:
Você tem duas instâncias, uma diz
NatToPeano 0 Zero
e a outra incluiNatToPeano 0 (Succ a)
(com algumas restrições). A resolução de instâncias de classe de tipo e acredito que a verificação de dependência funcional não leva as restrições em consideração, então isso é um conflito.