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