如何将可遍历的函数应用于一个值

1 haskell function list apply traversable

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

[a->b] -> a -> [b]
Run Code Online (Sandbox Code Playgroud)

基本上我有一个函数列表,所有函数都接受一个值a并返回b。我想将所有这些应用到一个a并得到结果[b]

我应该使用哪一种?

谢谢

Jos*_*ica 10

你不需要Traversable,只需Functor

swingMap f x = fmap ($ x) f
Run Code Online (Sandbox Code Playgroud)

另见swing功能(这相当于swing fmap)。


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


chi*_*chi 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]
Run Code Online (Sandbox Code Playgroud)

sequenceA并且traverse id,相同,也可以工作)

  • @dfeuer `fmap` 明显更简单,但仅此并不能解决问题;我们需要 `\fx -> fmap ($ x) f`,在我看来,这并不那么简单。我不认为这里有一个完全客观的“更简单”的概念。对我来说,我们需要将 `[a->b]` 变成 `a->[b]`,即通勤 `[]` 和 `a ->`,其中 `sequence`/`distribute` 做得很好而且很简单。当然,其他人可能不同意:-) (2认同)