而不是fmap
, 将函数应用于函子中的值:
fmap :: Functor f => (a -> b) -> f a -> f b
我需要一个函数,其中仿函数具有函数并且值很简单:
thing :: Functor f => f (a -> b) -> a -> f b
但我找不到一个。
这种模式叫什么,我将函数中的函子(或应用程序,或单子)应用于普通值?
我已经实现了它,我只是不太明白我做了什么以及为什么标准库中还没有这样的功能。
你不需要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
(in Data.Functor.Syntax
, from the functors
package) 和($#)
(from the synthesizer
package) 作为可能的名称。不过,我可能只是fmap ($ arg) f
在使用现场使用。
正如 Niklas 所说,这是在一些应用函子中对提升值的应用。
\f a -> f <*> pure a
:: Applicative f => f (a -> b) -> a -> f b
或更一般地(?),使用类别 (.)
\f a -> f . pure a
:: (Applicative (cat a), Category cat) => cat b c -> b -> cat a c