如何将值应用于函数列表

时间:2013-07-25 21:19:40

标签: haskell types functional-programming

我想要达到的目标是:

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

这与地图相反:

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

我已经尝试过Hoogle,但无济于事。任何人都可以在Haskell中建议一个干净的方法吗?

2 个答案:

答案 0 :(得分:15)

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

这是一种简洁的说法

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

可能更清楚。

答案 1 :(得分: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。 / p>