我在翻译这个 do
语句时遇到了一些问题:
ex10 :: [Int]
ex10 = do
num <- [1..20]
guard (even num)
guard (num `mod` 3 == 0)
return num
像这样的某种monad
语法:
ex10' :: [Int]
ex10' = [1..20] >>= (guard . even) >>= (guard . (==0) . (mod 3)) >>= \r -> return r
这行不通,我不太清楚为什么。我想我可能误解了 guard
但我不确定是什么意思。
最佳答案
guard
的类型是 MonadPlus m => Bool -> m ()
所以你的第三段
(guard . (==0) . (mod 3))
收到一个 ()
类型的值,这不是您想要的。在 do
符号中
do
guard (even num)
guard (num `mod` 3 == 0)
被脱糖成类似的东西
guard (even num) >> guard (num `mod` 3 == 0)
所以你可以将ex10'
实现为
ex10' = [1..20] >>= (\num -> (guard $ even num) >> (guard $ num `mod` 3 == 0) >> return num)
关于haskell - 对 'do' block 进行脱糖处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32683341/