我正在使用-
压缩两个列表,如下所示:
differences = zipWith (-) [5,6,7,8,9] [1,2,3,9,5]
如果其中一个压缩项为负数,differences
是否可以返回Nothing
?所以我希望函数停止压缩并在它碰到上面例子中的第4项时返回Nothing
。
编辑:或者如何将其与其他功能结合以获得所需的行为?
答案 0 :(得分:6)
您可以使用Control.Monad.zipWithM
自定义函数进行减法:
Prelude> let f x y = if x - y < 0 then Nothing else Just (x - y)
Prelude> import Control.Monad
Prelude Control.Monad> zipWithM f [5,6,7,8,9] [1,2,3,9,5]
Nothing
Prelude Control.Monad> zipWithM f [5,6,7,9,9] [1,2,3,9,5]
Just [4,4,4,0,4]
答案 1 :(得分:2)
无需将所有内容都放在zipWith中。哈斯克尔很懒。在评估列表时完成处理。
differences = zipWith (-) [5,6,7,8,9] [1,2,3,9,5]
result | any (<0) differences = Nothing
| otherwise = Just differences
缺点是需要评估整个列表(直到条件),但这对于要求是无法避免的。