Si consideri il seguente codice Haskell:Dipendenza funzionale Haskell a b -> c secondo c?
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances,
FunctionalDependencies #-}
class C a b c | a b -> c
instance C (l (i,j)) (r i j) j
instance C (l i j) (r (i,j)) j
-- Conflict between the following two lines
instance C (l (i,j)) (r (i,j)) j
instance C (l i j) (r i j) j
Qui, GHC produce un errore di dipendenze funzionali tra le ultime due righe. Se si rilascia una delle ultime due dichiarazioni di istanza, il codice viene compilato. Ho provato un analogo usando famiglie di tipi, che hanno anche prodotto un conflitto. La mia prima domanda è: perché le ultime due righe sono in conflitto, mentre le altre dichiarazioni funzionano tutte insieme?
Inoltre, se cambio l'ultima linea per
instance C (l i j) (r i j) i
GHC accetta il codice. Questo sembra abbastanza strano, poiché l'unica cosa che cambia è la variabile di tipo dipendente c. Qualcuno può spiegare questo comportamento?
Giusto per essere sicuro. Se rimuovi entrambe le prime due istanze c'è ancora un errore, giusto? – genisage
@genisage Sì, dipende solo dalle ultime due istanze –
Non riesco a riprodurre la seconda parte qui. 'istanza C (l i j) (r i j) i' causa un conflitto per me. (su ghc 7.8.3) – genisage