【发布时间】:2011-09-18 20:22:07
【问题描述】:
在尝试学习 Haskell 时,我遇到了一种情况,我希望对列表进行折叠,但我的累加器是 Maybe。然而,我正在折叠的函数接受了 Maybe 中的“提取”值,如果一个失败,它们都会失败。我有一个我觉得很笨拙的解决方案,但是我对 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)
所以基本上,有没有办法使用某种 Monad 折叠来清理或消除 explodingFourMonAdd 中的 lambda?或者以某种方式在 >>= 中进行柯里化
运算符,以便折叠的行为类似于由 >>=?
【问题讨论】:
-
顺便说一句,模块
Maybe已弃用。如果可能,请使用Data.Maybe。