6

我想要实现的是:

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

这是地图的倒数:

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

我试过Hoogle,但无济于事。任何人都可以在 Haskell 中提出一种干净的方法吗?

4

2 回答 2

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

这是一种简洁的说法

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

这可能更清楚。

于 2013-07-25T21:23:28.643 回答
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直接在代码中使用。

于 2013-07-25T22:22:54.423 回答