2012-07-04 22 views
5

Uno de los ejemplos de Learn You a Haskell es:explícitamente determinar qué función pura de usar

pure (+) <*> Just 3 <*> Just 5

Él afirma:

Así que en primer lugar, hemos pure (+), que es Just (+)

Estoy suponiendo que Haskell utiliza la inferencia de tipo en la función <*> para determinar que la función pure en el LHS será la de la instancia Maybe de la clase de tipo (basado en el hecho de que estamos usando Just 5 en el RHS, y Just es a Maybe).

Sin embargo, ¿hay algún caso en el que tenga un valor que desee convertir en un Funcionador Aplicativo utilizando el método pure, pero no lo va a usar de inmediato a través de la función <*> y así Haskell puede ¿Determinar qué función de pure usar? Si es así, ¿cómo sería el estado explícito que pure funciona para usar?

O, es el caso de que Haskell no tratará de determinar qué pure función hasta que el resultado de la función pure se utiliza en un contexto (por ejemplo, cuando le da de comer a una función <*> en algún momento)

+1

Esta es una pregunta de inferencia de tipo. – dave4420

Respuesta

11

Le pondrás una anotación de tipo. Si estaba definiendo como una variable, se utiliza una firma de tipo de nivel superior: (. Esto también funciona en let y where cláusulas)

foo :: Maybe (Integer -> Integer -> Integer) 
foo = pure (+) 

O si lo estaba utilizando en una expresión , escribirías (pure (+) :: Maybe (Integer -> Integer -> Integer)).

También puede obtener la función relevante pure sin tener que aplicarlo a un argumento. Ya que tenemos:

pure :: (Applicative f) => a -> f a 

... podemos decir (pure :: a -> Maybe a) para obtener un pure del tipo deseado. Pero (pure :: a -> Maybe a) (+) es más confuso que pure (+) :: Maybe (Integer -> Integer -> Integer), por lo que este último es probablemente más útil en general.

La última frase de su pregunta es correcta, sin embargo: se puede asignar pure (+) a una variable sin una firma tipo, y utilizarlo después en un tipo concreto específico (como Maybe (Integer -> Integer -> Integer)) sin tener que utilizar ningún anotaciones de tipo en absoluto . (Hay una pequeña restricción: si la define como una variable de nivel superior sin ninguna firma de tipo, entonces solo puede usarla como un tipo específico, no dos en lugares diferentes, debido al ... pero probablemente no necesita preocuparse por eso.)

+3

El último párrafo del texto de la pregunta también es cierto: a menudo, si aún no puede decidirse por un funtor aplicativo concreto, tampoco es necesario.No es necesario seleccionar inmediatamente un tipo concreto, puede definir el código derivado que está sobrecargado en el funcionador aplicativo. – kosmikus

Cuestiones relacionadas