¿Por qué esto provoca un conflicto?conflicto de dependencia funcional de Haskell
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
Tenga en cuenta que el código se compilará si elimino la dependencia funcional.
Tenía la impresión de que las dependencias funcionales solo deberían rechazar cosas como las siguientes, cuando de hecho, 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
mismo b
parámetro, sin embargo, diferentes parámetros a
. ¿No debería b -> a
rechazar esto, ya que esto significa que a
está determinado únicamente por b
?
¡extrañamente, la segunda versión * funciona *, aunque no puedo imaginar por qué! – sclv
Pero, si las instancias se compilan, ¿cuál es el punto de las dependencias funcionales? ¡Pensé que eran exactamente para evitar que este tipo de cosas se compilaran! –
@Daniel Wagner: Escribir instancias que nunca pueden funcionar, pero que son aceptadas por el compilador siempre que no intente usarlas, es un defecto conocido de las fundeciones, según mi leal saber y entender. Es una de las razones por las que prefiero las familias de tipos para la mayoría de los propósitos. –