Haskell-计算列表中某个值的出现次数

时间:2018-11-16 07:39:47

标签: haskell

因此,仍然需要完成Haskell教程...

提出的一个问题是使用以下代码编写函数:

count :: Eq a => [a] -> a -> Int

这可以包含一个数字和一个值的列表,并告诉您指定的值在列表中出现了多少次。

它说看是否可以使用列表理解,然后再次使用显式递归来编写它。

并且,不仅要用数字来计数-而且要用字母来表示,例如,“卖贝壳”中“ s”发生了多少次。

所以我得到了

countListComp :: Eq a => [a] -> a -> Int 
countListComp [] find = 0
countListComp ys find = length xs
    where xs = [xs | xs <- ys, xs == find]

和:

countRecursion :: Eq a => [a] -> a -> Int
countRecursion [] find = 0
countRecursion (x:xs) find 
    | find == x = 1 + (countRecursion xs find)
    | otherwise = countRecursion xs find

因此,它可以对列表中数字的出现进行计数,就像这样:

ghci > countListComp [1,3,2,3,4,3] 3
3

ghci > countRecursion [6,9,7,9,8,9] 9
3

但是当我寻找一个特定的字母时,它会这样做:

ghci > countListComp ["she sells sea shells"] "s"
0

ghci > countRecursion ["she sells sea shells"] "s"
0

它还说要尝试计算其他“可数”的东西,例如那里有多少列表...所以我尝试了:

ghci > countListComp [[1,2,3],[3,2,1],[4,5,6]] []
0

我的代码是否有问题,或者我没有指定要正确查找的内容?我认为是后者...因为以下有效:

例如,要查找“她卖贝壳”中“ s”出现了多少次……我真的要把每个字母都用引号引起来吗?喜欢:

ghci > countRecursion ['s','h','e',' ','s','e','l','l','s',' ','s','e','a',' ','s','h','e','l','l','s'] 's'
6

我是否必须查找特定于 的列表?还是有办法只查找其中包含任何内容的列表?

3 个答案:

答案 0 :(得分:7)

countListComp ["she sells sea shells"] "s"的问题是您有字符串列表。

您可能是说countListComp "she sells sea shells" 's'

Sting只是字符列表的别名。

使用countListComp [[1,2,3],[3,2,1],[4,5,6]] []是另一个问题。它不计算您有多少个列表。它计算有多少个列表等于您拥有的[]

如果尝试使用countListComp [[1,2,3],[],[4,5,6]] []countListComp [[1,2,3],[3,2,1],[4,5,6]] [3,2,1],则会得到1

答案 1 :(得分:3)

尝试查看"she sells sea shells"中的第一项是什么:

ghci> head "she sells sea shells"
=> 's'

的'是一个字符,而“ s”是一个单项[字符]。

答案 2 :(得分:1)

我认为您在这里有两个错误。

首先,当您将["she sells sea shells"]传递给函数时,实际上是传递了一个字符列表。因此,函数调用应如下所示。

countListComp "she sells sea shells" <second_parameter>

函数调用中的第二个问题是,字符串是一个字符列表,而Haskell中的列表则由头和尾组成。因此,当您以字符串形式传递"s"而不是char时,实际上是传递['s',[]]。因此正确的函数调用应该是:

countListComp "she sells sea shells" 's'