给定以下do notation代码:
do
a <- return 1
b <- [10,20]
return $ a+b是否有更多的习语转换:
ghci> return 1 >>= (\x -> map (+x) [10, 20])
[11,21]对比
ghci> return 1 >>= (\x -> [10, 20] >>= (\y -> [y+x]))
[11,21]发布于 2015-03-10 02:43:35
do符号映射到一元函数,所以严格地说,您可以编写
return 1 >>= (\a -> [10, 20] >>= (\b -> return $ a+b ))现在,您可以将>>= … return替换为fmap
return 1 >>= (\x -> fmap (\y -> x+y) [10, 20])并使用部分,并将常量1直接丢弃到函数中。
fmap (1+) [10, 20]或者,如果您真的想从列表中获取第一个求和,我建议使用liftM2
liftM2 (+) [1] [10, 20]与此相比,列表的Applicative实例具有更多的习性,并具有相同的结果:
(+) <$> [1] <*> [10, 20]https://stackoverflow.com/questions/28955226
复制相似问题