gpt4 book ai didi

haskell - 递归函数中缺少模式匹配

转载 作者:行者123 更新时间:2023-12-01 23:06:49 25 4
gpt4 key购买 nike

我刚开始学习 Haskell,在编写基本函数时遇到问题。

这个函数应该告诉我前一个元素比当前元素大的数组元素有多少。这是代码:

countIncreases :: (Ord a, Num b) => [a] -> b -> b
countIncreases [x] c = c
countIncreases (x:y:r) c
| y > x = countIncreases (y:r) (c+1)
| otherwise = countIncreases (y:r) c

我尝试用它来测试

countIncreases [1,2] 0

我将所有这些代码粘贴到 ghci 中,但出现错误

Non-exhaustive patterns in function countIncreases

不过我认为该案例所需的所有模式都是匹配的:

  1. 第一个迭代:x = 1y = 2r = []c = 02 > 1 所以我们进入第一个分支并调用 countIncreases (2:[]) (0 + 1)
  2. 第 2 次迭代:c = 1 所以返回 1

我做错了什么?

最佳答案

如果您运行您的函数,它不会产生错误,但是如果您在打开 -Wincomplete-patterns 的地方编译代码,并将警告视为错误(-Werror ), 会报错。

发生这种情况的原因是你不能用空列表运行这个函数。实际上,如果您使用空列表调用它,[x](x:y:r) 模式都会失败。

如果你计算增加项的数量,那么对于一个空列表,没有这样的元素,所以你可以这样实现:

countIncreases :: (Ord a, Num b) => [a] -> b -> b
countIncreases <strong>[]</strong> c = c
countIncreases <strong>[_]</strong> c = c
countIncreases (x:r@(y:_)) c
| y > x = countIncreases r (c+1)
| otherwise = countIncreases r c

关于haskell - 递归函数中缺少模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70734488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com