将“do notation”转换为>> = v.map

时间:2015-03-10 02:35:53

标签: haskell

给出以下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]

1 个答案:

答案 0 :(得分:13)

do符号映射到monadic函数,所以严格要写

 return 1 >>= (\a -> [10, 20] >>= (\b -> return $ a+b ))

现在,您可以只用fmap

替换>>= … return
 return 1 >>= (\x -> fmap (\y -> x+y) [10, 20])

并使用部分,并将常量1直接废弃到函数

 fmap (1+) [10, 20]

或者,如果您真的想从列表中获取第一个加号,我建议您使用liftM2

 liftM2 (+) [1] [10, 20]

比这更惯用,并且结果相同,是列表的Applicative实例:

(+) <$> [1] <*> [10, 20]