Пытаясь выучить Хаскелла, я наткнулся на ситуацию, в которой я хочу сделать складку по списку, но мой аккумулятор - это "Может быть". Функция, с которой я складываюсь, принимает значение "извлечено" в "Может быть", и если не удается, то все они терпят неудачу. У меня есть решение, которое я нахожу 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? Или каким-то образом выделывать лямбду в >>=
оператор так, чтобы складка вела себя как список функций, связанных >>=?