Perché questo si traduce in un conflitto?Haskell conflitto di dipendenza funzionale
class Foo a b | b -> a where
foo :: a -> b -> Bool
instance Eq a => Foo a a where
foo = (==)
instance Eq a => Foo a (a -> a) where
foo x f = f x == x
Si noti che il codice verrà compilato se mi tolgo la dependecy funzionale.
Avevo l'impressione che le dipendenze funzionali non consentissero altro che cose come quelle che seguono, quando in realtà compila!
class Foo a b | b -> a where
foo :: a -> b -> Bool
instance Eq a => Foo a a where
foo = (==)
instance Eq a => Foo Bool a where
foo _ x = x == x
Stesso b
parametro, eppure diversi a
parametri. Non dovrebbe b -> a
non consentire questo, in quanto ciò significa che a
è determinato in modo univoco da b
?
stranamente, la seconda versione * funziona *, anche se non riesco a immaginare perché! – sclv
Ma, se le istanze vengono compilate, qual è il punto delle dipendenze funzionali? Pensavo che fossero esattamente per impedire che questo genere di cose si compilasse! –
@Daniel Wagner: scrivere istanze che non possono mai funzionare, ma sono accettate dal compilatore finché non si tenta di usarle, è un difetto noto di fondi per il meglio delle mie conoscenze. È uno dei motivi per cui preferisco le famiglie di tipi per la maggior parte degli scopi. –