如果我想拥有类似的东西,我应该使用什么
[a->b] -> a -> [b]
基本上我有一个函数列表,所有函数都接受一个值a
并返回b
。我想将它们全部应用于一个a
并获得结果[b]
。
我应该使用哪一个?
谢谢
如果我想拥有类似的东西,我应该使用什么
[a->b] -> a -> [b]
基本上我有一个函数列表,所有函数都接受一个值a
并返回b
。我想将它们全部应用于一个a
并获得结果[b]
。
我应该使用哪一个?
谢谢
您不需要Traversable
,只需Functor
:
swingMap f x = fmap ($ x) f
或者,如果您使用Edward Kmett的distributive
library ,您可以通过使用from Data.Distributive获得最佳答案(仅 aFunctor
而不是 a Traversable
)和chi 的答案(避免为作业定义自定义函数)。distribute
您可以使用sequence
, 专门用于(->) a
monad。通过这种方式,您可以避免为作业定义自定义函数——它已经存在。
> :t sequence
sequence :: (Traversable t, Monad m) => t (m a) -> m (t a)
> :t sequence :: [a->b] -> a -> [b]
sequence :: [a->b] -> a -> [b] :: [a -> b] -> a -> [b]
> sequence [id,(10+),(10-)] 3
[3,13,7]
(sequenceA
并且traverse id
,同样,也可以)
当函数出现在数据类型中时,是时候记住应用程序了,因为它就是这样。一个人可以很容易地完成这项工作;
appList :: [a->b] -> a -> [b]
appList fs x = fs <*> pure x
λ> appList [(+1), (*2), subtract 3] 5
[6,10,2]