特定Int的号码,我想创建一个功能countElems
接受一个Int
和[Int]
和回报多少的特定Int
是在列表中。到目前为止,我有:在Haskell如何计算列表中
countElems :: Int -> [Int] -> Int
countElems n (x:xs)
| xs == [] = 0
| n == x = 1 + countElems n xs
| n /= x = countElems n xs
运行时,这似乎是工作,但进一步的检查,如果输入countElems 9 [5, 3, 9, 3, 9]
输出为1
,而不是2
。我可以看到这是因为在看到n == x
导致错误输出之前检查xs == []
,但是如果我将这两种情况交换为Non-exhaustive pattern
。进一步的思考后
编辑:
我可以消除错误@ user2407038贴有这样的代码:
countElems :: Int -> [Int] -> Int
countElems _ [] = 0
countElems n (x:xs)
| n == x = 1 + countElems n xs
| n /= x = countElems n xs
这看起来不太优雅,但工作得一样吗?
我喜欢这个答案,因为它让我的讲师错了,他说我们需要两个递归的例子,但这是解决这个问题的一个非常好的方法,谢谢! – benharris
@benharris讲师常常是“错误的”,因为他们教给你的东西并不一定是一个熟练的程序员会写的东西。真实世界的Haskell代码根本没有非常多的递归。它的大部分功能都可以通过库函数来实现,这使得代码更具可读性,更易于维护,减少了容易出错的情况等等。 – kqr