我是Haskell的新手,我有一个小问题。 我正在尝试编写一个函数来识别列表是否是算术序列。
我有这个不工作的代码:
isArithmSeq :: [Int] -> Bool
isArithmSeq [] = False;
isArithmSeq [x] = False;
isArithmSeq [x,y] = True;
isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)])
我不知道如何让它发挥作用。任何人都可以帮我纠正这个吗?
THX。
答案 0 :(得分:2)
试试这个:
isArithmSeq :: [Int] -> Bool
isArithmSeq [] = False
isArithmSeq [x] = False
isArithmSeq [x,y] = True
isArithmSeq (x:y:z:xs) = (x - y) == (y - z) && isArithmSeq (y:z:xs)
您已为递归定义定义了一个很好的基本案例。现在,您只需要检查连续元素之间的差异是否始终相同。
的原因isArithmSeq (x:y:xs) = (sum (x:y:xs)) == (sum [x,y..(last xs)])
不起作用是因为总和不是算术序列的唯一要求:
(sum [2,3,4,0,11,7]) == (sum [2,3,4,5,6,7])