而不是fmap
,它将函数应用于函数中的值:
fmap :: Functor f => (a -> b) -> f a -> f b
我需要一个函数,其中函子有一个函数,值很简单:
thing :: Functor f => f (a -> b) -> a -> f b
这个模式叫做什么,我将函数函数(或者在应用程序中,或者在monad中)应用于普通值?
我已经实现了它,我只是不太明白我做了什么以及为什么标准库中没有这样的功能。 < / p>
答案 0 :(得分:19)
您不需要Applicative
; Functor
会做得很好:
apply f x = fmap ($ x) f
-- or, expanded:
apply f x = fmap (\f' -> f' x) f
有趣的是,apply
实际上是flip
的概括; lambdabot用这个定义替换flip
作为标准Haskell的一个概括,所以这是一个可能的名称,虽然令人困惑。
顺便说一下,通常值得尝试Hayoo(搜索整个Hackage,与Hoogle不同)来查看函数的名称,以及它是否在任何通用包中。正在搜索f (a -> b) -> a -> f b
,它会flip
(Data.Functor.Syntax
中的functors
包)和($#)
(来自synthesizer
包)找到fmap ($ arg) f
名。不过,我可能只是在使用网站上使用{{1}}。
答案 1 :(得分:7)
正如尼克拉斯所说,这是一些应用函子应用于提升价值。
\f a -> f <*> pure a
:: Applicative f => f (a -> b) -> a -> f b
或更一般地(?),使用Category (.)
\f a -> f . pure a
:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c