【问题标题】:monadic desugaring haskell一元脱糖哈斯克尔
【发布时间】:2016-09-21 11:05:49
【问题描述】:

阅读关于现实世界 Haskell 中单子的章节。我遇到了 do 符号的脱糖,特别是当我们有类似 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 语句来做到这一点。

我需要一些帮助来了解这里实际发生了什么?

【问题讨论】:

  • 使用 lambda-case 等效于 let f = (\case pattern -&gt; do { act2; ... ; actN } ; _ -&gt; fail "...") in act1 &gt;&gt;= f

标签: haskell monads do-notation


【解决方案1】:

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

好吧,你可以:

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

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

如果你把它转换成where,可能会容易一些:

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

【讨论】:

  • “记住,这是一个 let ... in... 表达式,而不是 do's let” 不过在这方面,一个 do's let 并没有什么不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多