一元脱糖是一种很好的方法



阅读现实世界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子句中有两个模式匹配的情况?

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

我想要一些帮助来理解这里到底发生了什么?

我有困难理解是如何在一个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)

相关内容

最新更新