list - Haskell-我如何遍历和比较数组/列表
问题描述
我是 Haskell 的新手,但在其他一些语言方面我是老手。(这个问题取自汇编语言练习,但我想在 Haskell 中解决它。它不是作业或测试问题的一部分)
给定:具有列表内值的数组(列表)遵循以下模式:
第一项小于第二项,第二项大于第三项,第三项小于第四项,依此类推,(“波浪”)。
问题:
1 如何在 Haskell 中解决它?(我知道如何用其他可以处理数组索引的语言来解决它,但我不知道如何用函数式语言来解决它。
- 答案可以概括,以便它可以解决其他模式吗?
解决方案
这可以很容易地在 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)
推荐阅读
- c# - Unity - 构建相机与编辑器的“游戏”相机不同
- google-app-engine - 应如何从 App Engine 添加 Firebase 自定义声明?
- python - 如何将函数或表达式作为参数传递?
- java - 开箱即用 - WebService - DB - 网页/移动访问
- c# - xUnit Assert.Throws 和 Record.Exception 不捕获异常
- amazon-web-services - 使用 SAM 创建 API 密钥和使用计划
- python - Keras:在拟合时使用权重
- python-3.x - 用于搜索 Youtube 视频的 Python 文本源代码
- java - Jackcess 中的 Java SELECT @@Identity
- jdbc - JUnit 的独立数据源