Haskell-我如何走向并比较阵列/列表

时间:2018-05-14 17:19:27

标签: list haskell

我是Haskell的新手,但是其他语言的退伍军人。 (这个问题来自汇编语言练习,但我想在Haskell中解决它。它不是家庭作业或测试题的一部分)

给定:  列表中包含值的数组(列表)遵循以下模式:

第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(a" wave")。

问题:

1如何在Haskell中解决它? (我知道如何在其他语言中解决它,我可以处理数组索引,但我不知道如何用函数式语言解决它。

  1. 答案可以概括,以便解决其他模式吗?

2 个答案:

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

  1. 我们去&#34; up&#34;在x1x2之间,
  2. 我们去&#34; down&#34;在x2x3之间,
  3. x3以后的列表(包括x3)是波浪状的。