所以我有一个问题,我需要查看(x,y)形式的位置列表是否连续递增。
仅举几例意味着什么?
[(1,2), (1,3), (1,4), (1,5), (1,6)] it would return True, but
[(1,2), (1,3), (1,5), (1,6), (1,7)] will return False
例如,从这样开始。
is_in_order :: [Position] -> Bool
感谢您的帮助。
答案 0 :(得分:2)
由于这似乎是一个练习示例,我只提供一些提示而不是完整的解决方案:
仅检查所有第二个元组是否连续是一个简单的
checkConsecutive :: Num a => [a] -> Bool
checkConsecutive x = and $ zipWith (\x y -> y - x == 1) x (drop 1 x)
但我想现在的情况应该更为一般 - 你的inOrder
函数已经提供了一个很好的基线
isConsecutive :: Num a => [a] -> Bool
isConsecutive [] = True
isConsecutive [x] = True
isConsecutive (x:y:xs) = consecutive x y && isConsecutive (y:xs)
where consecutive :: (Num a, Num b) => (a,b) -> (a,b) -> Bool
consecutive (x1,y1) (x2,y2) = ..
你写道你需要case
才能做到这一点,你可以连续使用一个案例表达式,但我认为它不会使函数更清晰。
注意:您可以将上述功能简化为
isConsecutive (x:y:xs) = consecutive x y && isConsecutive (y:xs)
where consecutive :: (Num a, Num b) => (a,b) -> (a,b) -> Bool
consecutive (x1,y1) (x2,y2) = ..
isConsecutive _ = True
_
表示“catchall”模式 - 即匹配任何与上述模式不匹配的模式。
所以剩下的任务是声明两个元组的含义consecutive
。
答案 1 :(得分:0)
您可以这样实现isInOrder:
isInOrder xs = all check $ zip xs $ tail xs where
check ((x1,y1),(x2,y2)) = x1<=x2 && y2-y1==1
您可以按照“增加连续订单”的方式修改检查功能