名單,我想什麼來實現的是:如何將值應用到的功能
apply :: a -> [a -> b] -> [b]
這是種地圖的逆:
map :: (a -> b) -> [a] -> [b]
我試過Hoogle ,但無濟於事。任何人都可以提出一個乾淨的方式在Haskell做到這一點?
名單,我想什麼來實現的是:如何將值應用到的功能
apply :: a -> [a -> b] -> [b]
這是種地圖的逆:
map :: (a -> b) -> [a] -> [b]
我試過Hoogle ,但無濟於事。任何人都可以提出一個乾淨的方式在Haskell做到這一點?
apply :: a -> [a -> b] -> [b]
apply a = map ($ a)
這是說
apply a = map (\f -> f a)
這可能是更清晰的精闢方式。
\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
。
根據適用法律規定,對於所有的應用程序,「((<**>)。純粹的」)== == <*>純粹==純粹的($ y)<*> u == fmap($ y)最後更一般。 –