Haskell 如何将值应用于函数列表

Haskell 如何将值应用于函数列表,haskell,types,functional-programming,Haskell,Types,Functional Programming,我想要实现的是: apply :: a -> [a -> b] -> [b] 这是地图的一种相反形式: map :: (a -> b) -> [a] -> [b] 我试过胡闹,但没用。有谁能在Haskell提出一个干净的方法来做这件事吗 apply :: a -> [a -> b] -> [b] apply a = map ($ a) 这是一个简洁的说法 apply a = map (\f -> f a) 这一点可能更清楚。\a

我想要实现的是:

apply :: a -> [a -> b] -> [b]
这是地图的一种相反形式:

map :: (a -> b) -> [a] -> [b]
我试过胡闹,但没用。有谁能在Haskell提出一个干净的方法来做这件事吗

apply :: a -> [a -> b] -> [b]
apply a = map ($ a)
这是一个简洁的说法

apply a = map (\f -> f a)
这一点可能更清楚。

\a->map($a)
肯定很好,但也许更好的方法是:有

<**> :: Applicative f => f a -> f (a -> b) -> f b
虽然实际上,对于这个顶级绑定,我宁愿将签名限制为
a->[a->b]->[b]
,因为
Applicative
使您看起来像是拥有了最通用的签名,而不是:

apply :: Functor f => a -> f (a -> b) -> f b
apply a = fmap ($ a)

实际上,我的解决方案可能是最好的,当您处于某种管道中时,我敢说最好不要定义
apply
,而是使用
()。纯的
直接在代码中。

根据应用法则,
(().pure)yu==u pure y==pure($y)u==fmap($y)u
适用于所有的应用程序,但最后一个更一般。
apply :: Functor f => a -> f (a -> b) -> f b
apply a = fmap ($ a)