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 Num
MyType
, 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).
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