Складывая Maybes в Haskell

Пытаясь выучить Хаскелла, я наткнулся на ситуацию, в которой я хочу сделать складку по списку, но мой аккумулятор - это "Может быть". Функция, с которой я складываюсь, принимает значение "извлечено" в "Может быть", и если не удается, то все они терпят неудачу. У меня есть решение, которое я нахожу kludgy, но зная, как мало Haskell, как я делаю, я считаю, что должен быть лучший способ. Скажем, у нас есть следующая проблема с игрушками: мы хотим просуммировать список, но четверки по какой-то причине плохие, так что если мы попытаемся просуммировать в четвёрку в любой момент, мы хотим вернуть Ничего. Мое текущее решение следующее:

import Maybe

explodingFourSum :: [Int] -> Maybe Int
explodingFourSum numberList =
    foldl explodingFourMonAdd (Just 0) numberList
    where explodingFourMonAdd =
        (\x y -> if isNothing x
                    then Nothing
                    else explodingFourAdd (fromJust x) y)

explodingFourAdd :: Int -> Int -> Maybe Int
explodingFourAdd _ 4 = Nothing
explodingFourAdd x y = Just(x + y)

Итак, в принципе, есть ли способ очистить или устранить лямбду в взрывающейся FourMonAdd, используя какую-нибудь папку Monad? Или каким-то образом выделывать лямбду в >>= оператор так, чтобы складка вела себя как список функций, связанных >>=?

19
задан janders 18 September 2011 в 09:22
поделиться