2012-05-06 4 views
2

Просто пытаюсь получить мою голову вокруг монады ...Haskell Понимание Монады

глядя на этой странице на данный момент: http://www.haskell.org/haskellwiki/Simple_monad_examples

на дне он спрашивает, что эти фрагменты постановляют:

Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1)) 

Почему это ничего не возвращает? Из-за отказа вызова?

Nothing >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1)) 

Я понимаю этот.

+0

Спасибо за подтверждение и объяснение :) – Tobi3

ответ

8

Как всегда в Haskell, как правило, можно понять, какой код на встраивание и срок перезаписи:

Мы имеем:

Prelude> Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1)) 
Nothing 

Самое главное, что нам нужно, это определение fail и >>= для Maybe монада, учитывая, как:

instance Monad Maybe where 
    (Just x) >>= k  = k x 
    Nothing >>= _  = Nothing 

    (Just _) >> k  = k 
    Nothing >> _  = Nothing 

    return    = Just 
    fail _    = Nothing 

так что мы имеем:

Just 0 >>= (\ x -> if (x == 0) then fail "zero" else Just (x + 1)) 

-- by definition of >>= 
(\ x -> if (x == 0) then fail "zero" else Just (x + 1)) 0 

-- by definition of fail 
(\ x -> if (x == 0) then Nothing else Just (x + 1)) 0 

-- beta reduce 
if 0 == 0 then Nothing else Just (0 + 1) 

-- Integer math 
if True then Nothing else Just 1 

-- evaluate `if` 
Nothing 

и там у вас есть.

2

Да, из-за отказа вызова. Посмотрите, как Может быть, это экземпляр класса типов Monad:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/src/Data-Maybe.html#Maybe

fail _    = Nothing 
+0

n.b. вы можете найти это путем [hoogling Maybe] (http://www.haskell.org/hoogle/?hoogle=Maybe) и следовать правильной гиперссылке на документы, а затем щелкнуть ссылку «источник» на этой странице, как правило, в верхний правый угол. –

4

Поведение fail зависит от монады. В монадии Maybefail возвращает Nothing.

instance Monad Maybe where 
    return = Just 

    (Just x) >>= k = k x 
    Nothing >>= _ = Nothing 

    fail _ = Nothing 

Однако во многих других монад fail переводит error, так что реализация по умолчанию. Монады, которые предоставляют свои собственные fail, обычно являются таковыми в классе MonadPlus, где вы можете получить fail возвращение mzero, что составляет Nothing в размере Maybe monad.

На практике я не рекомендую использовать fail, так как так непонятно, что он будет делать. Вместо этого используйте соответствующий механизм сбоя монады, в которой вы находитесь: mzero, throwError или что-то еще.

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