因此,仍然需要完成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
我是否必须查找特定于 的列表?还是有办法只查找其中包含任何内容的列表?
答案 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'