2013-07-25 48 views
6

名單,我想什麼來實現的是:如何將值應用到的功能

apply :: a -> [a -> b] -> [b] 

這是種地圖的逆:

map :: (a -> b) -> [a] -> [b] 

我試過Hoogle ,但無濟於事。任何人都可以提出一個乾淨的方式在Haskell做到這一點?

回答

15
apply :: a -> [a -> b] -> [b] 
apply a = map ($ a) 

這是說

apply a = map (\f -> f a) 

這可能是更清晰的精闢方式。

3

\a -> map ($ a)肯定是好的,但也許還更好一點是Applicative方法:有

<**> :: Applicative f => f a -> f (a -> b) -> f b 

其中有一個實例<*> :: [a] -> [a->b] -> [b]。看起來很像你想要的東西!你只需要把你的a值放在一個單例列表中,對於這個列表,Applicative中也有一個專用函數:pure

apply :: Applicative f => a -> f (a -> b) -> f b 
apply = (<**>) . pure 

雖然實際上,我寧願限制簽名a -> [a->b] -> [b]這個頂級的結合,因爲Applicative使它看起來像你有最普遍的簽名可能的,它是不是:

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

真的,我的解決方案可能是最好的,當你在一些管道,我敢說最好是而不是來定義apply,但直接在代碼中使用(<**>) . pure

+2

根據適用法律規定,對於所有的應用程序,「((<**>)。純粹的」)== == <*>純粹==純粹的($ y)<*> u == fmap($ y)最後更一般。 –

相關問題