Pregunta

Realmente no puedo conseguirlo. ¿Por qué la necesitamos en absoluto? Me refiero a si uso el mismo parámetro de tipo, creo que los medios deben ser del mismo tipo.

He oído que puede ayudar a que el compilador para evitar el bucle infinito. Alguien puede decirme algunos detalles más sobre eso?

Al final, ¿hay 'patrones y prácticas' que debemos 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, he utilizado la misma variable de tipo 'a' tanto para contenedor y elemento, creo que el compilador puede pues inferir 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' sin resolver tipo?

¿Fue útil?

Solución

explica bastante bien. Así que, básicamente, si usted tiene una relación de un FD -> b es todo lo que significa para el tipo de clase ejemplo sólo puede haber una 'b' con cualquier 'a' por lo Int Int pero no se puede Int tiene flotador también. Eso es lo que quieren decir cuando se dice que 'b' se determina de forma única desde 'A'. Esto se extiende a cualquier número de parametros de tipo. La razón por la que se necesita es 1. La inferencia de tipos 2. A veces se quiere una restricción de esa manera.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top