2016-09-21 59 views
1

阅读关于现实世界中单子的章节Haskell。我遇到了符号的解除,特别是当我们有像pattern <- action之类的东西时。monadic desugaring haskell

-- 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语句来实现这一点。

我想了解一些实际发生的事情吗?

+0

与λ-情况下,它等同于'让F =(\ Case模式 - >做{ACT2; ...; act1}; _ - >失败“...”)在act1 >> = f'中。 –

回答

3

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

“请记住,这是一个让......在......表达式中,不是让”让我们在这方面不会有任何不同。 – sepp2k