Domanda

Perché questo deriva in un conflitto?

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 si compilerà se rimuovo la dipendenza funzionale.

Avevo l'impressione che le dipendenze funzionali dovessero non consentire cose come le seguenti, quando in realtà, si 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, ma diverso a parametri. Non dovrebbe b -> a non consentire questo, come significa a è determinato in modo univoco da b?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top