simbolos otherwise opciones librerias importar hacer funciones ejemplos como ciclos haskell symbols

otherwise - ¿Qué significa el símbolo=> en Haskell?



otherwise haskell (4)

Soy nuevo en Haskell y, en general, en la programación funcional, y me siento un poco incómodo con su sintaxis.

En el siguiente código, ¿qué denota el => ? Y también (Num a, Ord a) ?

loop :: (Num a, Ord a) => a -> (t -> t) -> t -> t


En el lado izquierdo de => usted declara restricciones para los tipos que se usan a la derecha.

En el ejemplo que da, significa que a está limitado a ser una instancia tanto de la clase de tipo Ord como de la clase de tipo Num .


Esta es una restricción de clase de tipos; (Num a, Ord a) => ... significa que el loop funciona con cualquier tipo a que sea una instancia de las clases de números Num y Ord , correspondientes a tipos numéricos y tipos ordenados respectivamente. Básicamente, puede pensar que loop tiene el tipo en el lado derecho de => , excepto que se requiere que a sea una instancia de Num y Ord .

Puede pensar que las clases de tipos son básicamente similares a las interfaces OOP (¡pero no son lo mismo!): Encapsulan un conjunto de definiciones que cualquier instancia debe admitir, y el código genérico puede escribirse usando estas definiciones. Por ejemplo, Num incluye operaciones numéricas como la suma y la multiplicación, mientras que Ord incluye menos que, mayor que, y así sucesivamente.

Para obtener más información sobre las clases de tipos, consulte esta introducción en Learn You a Haskell .


Una forma de pensarlo es que Ord a y Num a son entradas adicionales para la función. Sin embargo, son un tipo especial de entrada: los diccionarios . Cuando utiliza esta función con un tipo particular a , también debe haber diccionarios disponibles para las operaciones Ord y Num en el tipo a .

Cualquier función que haga uso de una función con entradas de diccionario también debe tener las mismas entradas de diccionario.

foo :: (Num a, Ord a) => a -> t foo x = loop x someFunc someT

Sin embargo, no tiene que pasar estos diccionarios explícitamente. Haskell se encargará de eso por usted, suponiendo que haya un diccionario disponible. Puedes crear un diccionario con una instancia de typeclass .

instance Num MyType with x + y = ... x - y = ... ...

Esto crea un diccionario para las operaciones Num en MyType , por lo que MyType se puede usar en cualquier lugar en el que Num a sea ​​una entrada obligatoria (suponiendo que cumpla con los otros requisitos, por supuesto).


=> separa dos partes de una firma de tipo:

  • A la izquierda, restricciones de tipo de clase.
  • A la derecha, el tipo real

Así que puedes pensar en (Num a, Ord a) => a -> (t -> t) -> t -> t que significa "el tipo es a -> (t -> t) -> t -> t y también debe haber una instancia de Num para a instancia de Ord y a ".

Para más información sobre las clases de tipos, visite http://www.learnyouahaskell.com/types-and-typeclasses