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