monadic desugaring haskell

时间:2016-09-21 11:05:50

标签: haskell monads do-notation

阅读真实世界Haskell中关于monad的章节。我偶然发现了记号,特别是当我们有pattern <- action之类的东西时。

-- file: ch14/Do.hs
doNotation3 =
  do pattern <- act1
     act2
     {- ... etc. -}
     actN

上面的例子被贬低为:

-- file: ch14/Do.hs
translated3 =
  let f pattern = do act2
                   {- ... etc. -}
                   actN
      f _     = fail "..."
      in act1 >>= f

我无法理解你如何在let子句中有两个模式匹配案例?

我不明白你如何在同一个let子句中拥有f patternf _。我试着查看你是否可以在let子句中有多个模式匹配,但从我所看到的,大多数人都使用case语句来做到这一点。

我想帮助理解这里的实际情况?

1 个答案:

答案 0 :(得分:3)

  

我无法理解你如何在let子句中有两个模式匹配案例?

嗯,你可以:

example :: Int -> Int
example n = 
  let f 0 = 1
      f x = x * f (x - 1)
  in  f n

请记住,这是一个let … in…表达式,而不是do&#39; s let。对于这种表达式中的所有绑定,(几乎)与通常的顶级表达式相同的规则保持不变,例如你可以使用模式匹配。

如果将其转换为where,可能会更容易一些:

example :: Int -> Int
example n = f n
  where            
      f 0 = 1
      f x = x * f (x - 1)