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

zpjtge22  于 2023-11-18  发布在  其他
关注(0)|答案(4)|浏览(127)

所以仍然通过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


是我的代码有问题,还是我没有正确指定要查找的内容?我认为是后者.
例如,在“She sells sea shells”中查找“s”出现了多少次.

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


我必须寻找一个 * 特定 * 的列表吗?或者有没有一种方法可以找到一个包含任何内容的列表?

v1l68za4

v1l68za41#

countListComp ["she sells sea shells"] "s"的问题是你有一个字符串列表。
你可能是说countListComp "she sells sea shells" 's'
斯汀只是一系列角色的别名。
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

rm5edbpk

rm5edbpk2#

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

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

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

iswrvxsc

iswrvxsc3#

在我看来,你有两个错误。
首先,当你把["she sells sea shells"]传递给你的函数时,你实际上传递了一个字符列表的列表。所以函数调用应该如下所示。

countListComp "she sells sea shells" <second_parameter>

字符串
函数调用中的第二个问题是,String是一个字符列表,而Haskell中的list由头和尾列表组成。所以当你传递"s"作为string,而不是char时,你实际上传递的是['s',[]]。所以正确的函数调用应该是:

countListComp "she sells sea shells" 's'

kt06eoxx

kt06eoxx4#

使用过滤器和长度的相同程序。

count xs find = length (filter (== find) xs)

字符串
欢呼

相关问题