在压缩时返回任何内容

时间:2016-05-07 09:01:41

标签: haskell

我正在使用-压缩两个列表,如下所示:

differences = zipWith (-) [5,6,7,8,9] [1,2,3,9,5]

如果其中一个压缩项为负数,differences是否可以返回Nothing?所以我希望函数停止压缩并在它碰到上面例子中的第4项时返回Nothing

编辑:或者如何将其与其他功能结合以获得所需的行为?

2 个答案:

答案 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

缺点是需要评估整个列表(直到条件),但这对于要求是无法避免的。