5

No puedo entenderlo. ¿Por qué lo necesitamos en absoluto? Quiero decir, si uso el mismo parámetro de tipo, creo que eso significa que deberían ser del mismo tipo.Dependencia funcional en Haskell

Escuché que puede ayudar al compilador a evitar el ciclo infinito. ¿Puede alguien decirme más detalles sobre eso?

Al final, ¿hay algún 'patrón y prácticas' que debamos seguir en el uso de la dependencia funcional en Real World Haskell?

[pregunta de seguimiento]

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

En el código anterior, que utiliza la misma variable de tipo 'A' para los dos contenedores y el elemento, creo que el compilador puede pues deducir que estos dos tipos son del mismo tipo

Pero cuando traté este código en GHCi, me dio la siguiente respuesta:

*Main> extract('x',3) 
<interactive>:1:0: 
    No instance for (Extract (Char, t) element) 
     arising from a use of `extract' at <interactive>:1:0-13 
    Possible fix: 
     add an instance declaration for (Extract (Char, t) element) 
    In the expression: extract ('x', 3) 
    In the definition of `it': it = extract ('x', 3) 

Cuando uno de ellos se ha especificado a ser de tipo 'char', ¿por qué el otro es todavía elemento de tipo no resuelta ' ¿?

+5

hace http://www.haskell.org/haskellwiki/Functional_dependencies help? – lijie

Respuesta

6

Pensé que esto explains bastante bien. Así que, básicamente, si tiene una relación FD de a -> b, todo lo que significa es para la clase de tipo instancia, solo puede haber una 'b' con cualquier 'a' Int Int, pero tampoco puede tener Int Float . Eso es lo que quieren decir cuando se dice que 'b' se determina de forma única a partir de 'a'. Esto se extiende a cualquier cantidad de parámetros de tipo. La razón por la que se necesita es 1. Escriba inferencia 2. A veces quiere una restricción como esa.

Una alternativa a los FD es la extensión de familias tipo pero no para todos los casos de FD.

+0

Gracias por su comentario. Ese artículo es genial. Ahora sé exactamente cuál es mi verdadera pregunta. Dijiste 'a veces quieres una restricción como esa'. Yo entiendo esta parte. Pero no entiendo por qué es necesario para la inferencia de tipo. He actualizado mi pregunta con otra pregunta de seguimiento. El ejemplo es de esa página wiki que mencionaste anteriormente. – aXqd

+0

Finalmente lo descubrí. El compilador aún está tratando de encontrar la instancia correcta de typeclass, por lo tanto, aún no tiene nada que ver con esa instancia específica. No doy el tipo de devolución, por lo tanto, es ambiguo. – aXqd

+0

Si agrego dependencia funcional, el compilador puede estar seguro de que, siempre que el tipo de contenedor pueda encontrar una coincidencia, el compilador puede usar esa instancia, porque ahora puede tener UN solo tipo de tipo de retorno. – aXqd

Cuestiones relacionadas