所以仍然通过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
型
我必须寻找一个 * 特定 * 的列表吗?或者有没有一种方法可以找到一个包含任何内容的列表?
4条答案
按热度按时间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
。rm5edbpk2#
试着看看
"she sells sea shells"
中的第一项是什么:字符串
“s”是一个字符,而“s”是一个单项[字符]。
iswrvxsc3#
在我看来,你有两个错误。
首先,当你把
["she sells sea shells"]
传递给你的函数时,你实际上传递了一个字符列表的列表。所以函数调用应该如下所示。字符串
函数调用中的第二个问题是,String是一个字符列表,而Haskell中的list由头和尾列表组成。所以当你传递
"s"
作为string,而不是char时,你实际上传递的是['s',[]]
。所以正确的函数调用应该是:型
kt06eoxx4#
使用过滤器和长度的相同程序。
字符串
欢呼