2012-04-25 18 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 
相關問題