data - ¿Para qué es "|" en una definición de clase Haskell?
syntax haskell (2)
Especifica una dependencia funcional .
No puedo entender qué significa la parte "| m -> w" en una definición de clase como esta:
class (Monoid w, Monad m) => MonadWriter w m | m -> w
¿Qué información adicional agrega esto a la definición de la clase?
La barra vertical es un separador sintáctico sin significado en sí mismo, utilizado para introducir dependencias funcionales en una clase de tipo multiparámetro, por lo que técnicamente |
no significa nada en absoluto. Presumiblemente |
fue elegido como una analogía visual para el uso del mismo símbolo para guardias de patrones en funciones.
En cuanto a las dependencias funcionales mismas, simplemente lea x -> y
como "el parámetro de tipo x
determina de manera única el parámetro de tipo y
", lo que significa que saber solo x
es suficiente para encontrar la instancia correcta. Existen otras complicaciones, especialmente con otras extensiones de GHC habilitadas, pero la mayoría de las veces no necesita preocuparse por ellas.
Por el contrario, sin dependencias funcionales, la selección de una instancia de una clase de tipo multiparámetro requiere que se conozcan todos los parámetros de tipo. Un ejemplo típico tiene un parámetro que es un tipo de contenedor y un segundo es el tipo de los elementos contenidos; funciones como "concatenar" o "isEmpty" no necesitan mencionar el tipo de elemento, solo el tipo de contenedor, y por lo tanto sería ambiguo.
Además, si está escribiendo sus propias clases de tipos, considere usar familias de tipos , que son un nuevo enfoque que eventualmente puede reemplazar las dependencias funcionales. A grandes rasgos, las familias de tipos le permiten escribir definiciones de tipos sobrecargados dentro de una instancia, no solo funciones sobrecargadas.