2016-09-21 47 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