В попытке узнать Haskell, я столкнулся с ситуацией, в которой я хочу сделать сгиб над списком, но мой аккумулятор - это Maybe. Функция, которую я складываю, тем не менее берет "извлеченное" значение в "Maybe", и если он терпит неудачу, все они терпят неудачу. У меня есть решение, которое я нахожу kludgy, но, зная как мало Haskell, как и я, я считаю, что должен быть лучший способ. Скажем, у нас есть следующая игрушечная проблема: мы хотим суммировать список, но по какой-то причине четверо - плохо, поэтому, если мы попытаемся суммировать в четыре раза в любое время, мы хотим вернуть Nothing. Мое текущее решение выглядит следующим образом:
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)
Итак, в принципе, есть ли способ очистить или устранить лямбда в explodingFourMonAdd
, используя какую-то разновидность Монады? Или как-то карри в → =
оператора так, что сложение ведет себя как список функций, прикованных к → =?