列表上的应用函数

时间:2014-12-17 00:30:10

标签: haskell applicative

我知道以下是:

[(+2),(+1)]<*>[1,2,3] == [3,4,5,2,3,4]

我也理解fmap已实施为map。但是我怎么能在脑海里精神上映射这个计算呢?我第一次看到这个时,我假设了以下内容:

[(*2),(+1)]<*>[1,2,3] == [4,5,6]

我第二次关于:[[3,4,5],[2,3,4]]。但另一方面,<*>会返回f b,所以我知道这是不可能的。所以我的问题是,有什么理由可以解决这个问题?

3 个答案:

答案 0 :(得分:13)

fs <*> xs或多或少[f x | f <- fs, x <- xs]。 Monads具有Applicative实例

fM <*> xM = do 
  f <- fM
  x <- xM
  return (f x)

直接对应于列表理解。

答案 1 :(得分:6)

要记住这一点,您可能会发现简单地将<*>想象成×(笛卡尔积)更容易:

[a, b, c] × [x, y, z] == [a x, a y, a z, b x, b y, ...]

答案 2 :(得分:0)

有趣。应用程序是否总是必须是笛卡尔积?还是该策略确实是一个选择问题。例如,两个列表的“ zip”是否也有效?即:

  

[F1,F2,F3] <*> [a,b,c] == [F1 a,F2 b,F3 c]