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