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

У меня возникают проблемы понимания, как вы можете иметь два паттерна, соответствующие случаи в пункте пусть?

Я не понимаю, как вы можете иметь f pattern и f _ в том же разрешении. Я попытался поискать, если вы можете иметь несколько совпадений шаблонов в предложении let, но из того, что я видел, большинство людей используют оператор case для этого.

Мне нужна помощь в понимании того, что на самом деле происходит здесь?

+0

с лямбда-случае это эквивалентно 'Пусть F = (\ случае шаблон -> делать {act2; ...; actN}; _ -> fail "...") в act1 >> = f'. –

ответ

3

У меня возникли проблемы с пониманием, так как вы можете иметь два случая соответствия шаблону в позиции let?

Ну, вы можете:

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

Помните, что это let … in… выражение, не do «s let. И для всех привязок в таком выражении (почти) используются те же правила, что и для обычных обычных выражений верхнего уровня, например. вы можете использовать сопоставление шаблонов.

Может быть, это становится немного легче, если вы преобразовать его в where:

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

«Помните, что это выражение ... в ... выражении, а не« давайте ».« Да, пусть это не будет по-другому в этом отношении. – sepp2k

Смежные вопросы