我是Haskell的新手,但是其他语言的退伍军人。 (这个问题来自汇编语言练习,但我想在Haskell中解决它。它不是家庭作业或测试题的一部分)
给定: 列表中包含值的数组(列表)遵循以下模式:
第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(a" wave")。
问题:
1如何在Haskell中解决它? (我知道如何在其他语言中解决它,我可以处理数组索引,但我不知道如何用函数式语言解决它。
答案 0 :(得分:7)
这在Haskell中非常容易表达
wave :: (Ord a) => [a] -> Bool
wave xs = and $ zipWith3 ($) (cycle [(<),(>)]) xs (tail xs)
我们也可以在模式上简单地对其进行参数化
waveLike :: [(a -> a -> Bool)] -> [a] -> Bool
waveLike patterns xs = and $ zipWith3 ($) (cycle patterns) xs (tail xs)
twoUpTwoDown :: (Ord a) => [a] -> Bool
twoUpTwoDown = waveLike [(<),(<),(>),(>)]
coprimeThenNotCoprime :: (Integral a) => [a] -> Bool
coprimeThenNotCoprime = waveLike [coprime, notCoprime]
where coprime m n = gcd m n == 1
notCoprime m n = not (coprime m n)
答案 1 :(得分:6)
Probie是一个非常优雅的解决方案,但对于初学者来说,或许基本的递归可能更容易理解。
wave :: (Ord a) => [a] -> Bool
wave [] = True
wave [_] = True
wave [x1,x2] = x1 < x2
wave (x1:x2:x3:xs) = x1 < x2 && x2 > x3 && wave (x3:xs)
这四行代码如下:
包含0个元素的列表是波浪状的。
包含1个元素的列表是波浪状的。
如果它增加,则包含2个元素的列表是波浪状的。
包含至少3个以x1,x2,x3
开头的元素的列表是wavy iff
x1
和x2
之间,x2
和x3
之间,x3
以后的列表(包括x3
)是波浪状的。