1

如果我想拥有类似的东西,我应该使用什么

[a->b] -> a -> [b]

基本上我有一个函数列表,所有函数都接受一个值a并返回b。我想将它们全部应用于一个a并获得结果[b]

我应该使用哪一个?

谢谢

4

3 回答 3

10

您不需要Traversable,只需Functor

swingMap f x = fmap ($ x) f

另请swing参见函数(这相当于swing fmap)。


或者,如果您使用Edward Kmettdistributivelibrary ,您可以通过使用from Data.Distributive获得最佳答案(仅 aFunctor而不是 a Traversable)和chi 的答案(避免为作业定义自定义函数)。distribute

于 2020-03-09T23:48:01.747 回答
6

您可以使用sequence, 专门用于(->) amonad。通过这种方式,您可以避免为作业定义自定义函数——它已经存在。

> :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,同样,也可以)

于 2020-03-10T00:33:31.903 回答
1

当函数出现在数据类型中时,是时候记住应用程序了,因为它就是这样。一个人可以很容易地完成这项工作;

appList :: [a->b] -> a -> [b]
appList fs x = fs <*> pure x

λ> appList [(+1), (*2), subtract 3] 5
[6,10,2]
于 2020-03-10T10:35:26.687 回答