haskell - 对 'do' block 进行脱糖处理

标签 haskell syntax monads

我在翻译这个 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/

相关文章:

haskell - 类型论中 mu (μ) 绑定(bind)的范围

sql - 将字符串转换为数字,将 null 或空字符串解释为 0

MYSQL语法条件COUNT

haskell - Haskell 的 Either Monad 中如何处理类型错误?

Haskell 中任何顺序或维度的列表理解

haskell - "All about monads"中的 MonadError 部分

multithreading - 我如何在 ghc-7.4 中使用带有 gtk2hs 的线程?

haskell - 为什么会这样评价?

haskell - Haskell 中的新类型行为

swift - 无法强制转换为 init 的协议(protocol)一致性