我想要实现的是:
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
直接在代码中使用。