2012-02-04 18 views
15

Soy nuevo en Haskell y, en general, en la programación funcional, y estoy un poco incómodo con su sintaxis.¿Qué significa el símbolo => en Haskell?

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

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

Respuesta

23

Esta es una restricción de clase de tipo; (Num a, Ord a) => ... significa que loop funciona con cualquier tipo a que es una instancia de las clases de tipos 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 a debe ser 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 utilizando estas definiciones. Por ejemplo, Num incluye operaciones numéricas como la suma y la multiplicación, mientras que Ord incluye menos que, más que, y así sucesivamente.

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

1

En el lado izquierdo de la => se declara restricciones para los tipos que se utilizan en la derecha.

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

8

=> separa dos partes de una firma de tipo:

  • A la izquierda, clase de tipos limitaciones
  • A la derecha, el tipo real

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

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

4

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

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 explícitamente estos diccionarios.Haskell se encargará de eso por usted, suponiendo que haya un diccionario disponible. Puede crear un diccionario con una instancia de clase de tipo .

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

Esto crea un diccionario para las operaciones en NumMyType, por lo tanto, MyType se puede utilizar en cualquier lugar que Num a es una entrada requerida (suponiendo que satisfaga los demás requisitos, por supuesto).

+1

Vale la pena aclarar que, aunque los llamamos "diccionarios", no son tablas hash, sino registros de funciones. Son como v-tables en lenguajes orientados a objetos, excepto que no están adjuntos a valores. – hammar