首页 > 解决方案 > Haskell-我如何遍历和比较数组/列表

问题描述

我是 Haskell 的新手,但在其他一些语言方面我是老手。(这个问题取自汇编语言练习,但我想在 Haskell 中解决它。它不是作业或测试问题的一部分)

给定:具有列表内值的数组(列表)遵循以下模式:

第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(“波浪”)。

问题:

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

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

标签: listhaskell

解决方案


这可以很容易地在 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)

推荐阅读