16

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

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

我需要一个函数,其中仿函数具有函数并且值很简单:

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

但我找不到一个

这种模式叫什么,我将函数中的函子(或应用程序,或单子)应用于普通值?

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

4

2 回答 2

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(in Data.Functor.Syntax, from the functorspackage) 和($#)(from the synthesizerpackage) 作为可能的名称。不过,我可能只是fmap ($ arg) f在使用现场使用。

于 2012-04-25T16:52:00.810 回答
7

正如 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
于 2012-04-25T16:30:41.030 回答