我想要达到的目标是:
apply :: a -> [a -> b] -> [b]
这与地图相反:
map :: (a -> b) -> [a] -> [b]
我已经尝试过Hoogle,但无济于事。任何人都可以在Haskell中建议一个干净的方法吗?
答案 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>