这个功能或模式有名称吗?

时间:2012-04-25 16:17:07

标签: function haskell typeclass

而不是fmap,它将函数应用于函数中的值:

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

我需要一个函数,其中函子有一个函数,值很简单:

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

但我can't find one

这个模式叫做什么,我将函数函数(或者在应用程序中,或者在monad中)应用于普通值?

我已经实现了它,我只是不太明白我做了什么以及为什么标准库中没有这样的功能。 < / p>

2 个答案:

答案 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,它会flipData.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