2012-04-25 17 views
16

代替fmap,其应用一个函数的值,在-A-算符:这个函数或模式是否有名字?

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

我需要的地方函子具有这样的功能的函数,并且该值是纯:

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

但我can't find one

这个模式叫做什么,我在其中应用函子中的函数(或者在应用中,或者在monad中)到一个普通的值?

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

+4

这不仅仅是申请者的特例吗?像'func <*>纯价值'? – 2012-04-25 16:21:40

+2

请注意,该类型与“ap”和“<*>”非常相似。虽然我没有看到相应的“Functor”版本,并且可以在不假设“Applicative”或“Monad”的情况下实现:'fs'= fmap(\ f - > fx)fs' – 2012-04-25 16:23:00

+0

是的,lambdabot说'thing =(.pure)。 (<*>)'或'thing = flip(fmap。flip id)'。但我知道这不是你想知道的:) – 2012-04-25 16:26:17

回答

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

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 
相关问题