我知道以下是:
[(+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
,所以我知道这是不可能的。所以我的问题是,有什么理由可以解决这个问题?
答案 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]