2012-04-25 17 views
16

En lugar de fmap, que aplica una función a un valor-in-a-funtor:¿Hay un nombre para esta función o patrón?

fmap :: Functor f => (a -> b) -> f a -> f b 

que necesitaba una función donde el funtor tiene una función y el valor es simple:

thing :: Functor f => f (a -> b) -> a -> f b 

pero yo can't find one.

¿Cómo se llama este patrón, donde aplico una función en un eje (o en un aplicativo, o en una mónada) a un valor simple?

Ya lo he implementado, simplemente no entiendo muy bien lo que hice y por qué no había una función así en las bibliotecas estándar.

+4

¿No es este solo un caso especial de un solicitante? Como 'func <*> pure value'? –

+2

Observe que el tipo es muy similar a 'ap' y' <*> '. Aunque no veo una versión correspondiente de 'Functor', y esto puede implementarse sin asumir' Applicative's 'Monad's:' thing fs x = fmap (\ f -> fx) fs' –

+0

Sí, dice lambdabot 'thing = (.pure). (<*>) 'o' thing = flip (fmap. Flip id) '. Pero entiendo que esto no es lo que quieres saber :) –

Respuesta

19

No es necesario Applicative para esto (?); Functor no tendrán ningún problema:

apply f x = fmap ($ x) f 
-- or, expanded: 
apply f x = fmap (\f' -> f' x) f 

Curiosamente, apply es en realidad una generalización de flip; lambdabot reemplaza flip con esta definición como una de sus generalizaciones de Haskell estándar, por lo que es un nombre posible, aunque confuso.

Por cierto, a menudo vale la pena probar Hayoo (que busca la totalidad de Hackage, a diferencia de Hoogle) para ver qué nombres se suelen asignar a una función y si se trata de un paquete genérico. Buscando f (a -> b) -> a -> f b, encuentra flip (en Data.Functor.Syntax, del paquete functors) y ($#) (del paquete synthesizer) como posibles nombres. Aún así, probablemente solo use fmap ($ arg) f en el sitio de uso.

7

Como dice Niklas, esta es la aplicación en algún funcionador aplicativo a un valor elevado.

\f a -> f <*> pure a 

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

o más en general, el uso de Category(.)

\f a -> f . pure a 

:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c 
Cuestiones relacionadas