List 我在haskell有一个练习,我需要帮助纠正它
我必须定义一个函数List 我在haskell有一个练习,我需要帮助纠正它,list,haskell,List,Haskell,我必须定义一个函数 choose :: Int -> [Int] -> [Int] choose n ns = ... 它拾取列表中整数n的所有匹配项。比如说, choose 1 [1, 2, 1, 4, 5, 1] == [1, 1, 1] choose 1 [2, 3, 4, 6] == [] 我已经研究了如何过滤列表并计算出现的次数,只是现在我想要的是返回一个包含重复数字的列表 例如: 仅此代码返回事件总数,而不是包含事件数的列
choose :: Int -> [Int] -> [Int]
choose n ns = ...
它拾取列表中整数n
的所有匹配项。比如说,
choose 1 [1, 2, 1, 4, 5, 1] == [1, 1, 1]
choose 1 [2, 3, 4, 6] == []
我已经研究了如何过滤列表并计算出现的次数,只是现在我想要的是返回一个包含重复数字的列表 例如:
仅此代码返回事件总数,而不是包含事件数的列表,从模板开始
choose :: Int -> [Int] -> [Int]
choose n xs = ...
您需要从模式匹配开始。您可以在n
或xs
上进行匹配。由于n
只是一个数字,我们不在乎它是哪一个,因此它上的模式匹配只会给我们提供选项0
、1
、-2
等等。xs
上的模式匹配提供了两种情况:要么列表为空,要么至少有一个元素:
choose :: Int -> [Int] -> [Int]
choose n xs =
case xs of
[] -> ...
x : rest -> ...
对于空列表,[]
,解释是您必须从空列表中选择所有出现的n
的列表。由于空列表中没有出现n
,因此出现的空列表正确地描述了结果:
choose :: Int -> [Int] -> [Int]
choose n xs =
case xs of
[] -> []
x : rest -> ...
if n == x
then ...
else ...
对于非空列表,x:rest
,您必须考虑可能的情况:可能x
和n
是相同的数字,在这种情况下x
应该是结果的一部分。可能x
和n
不是同一个数字,在这种情况下x
不应该是结果的一部分。在这两种情况下,rest
是所有剩余的数字,其中一些数字可能也有n
的副本
因此,对于非空列表,x:rest
,您实际上在做三件事:
x
是否应为结果的一部分:
choose :: Int -> [Int] -> [Int]
choose n xs =
case xs of
[] -> []
x : rest -> ...
if n == x
then ...
else ...
rest
上递归地应用选择n
:
choose n rest
x
的结果与在rest
上递归应用choose n
的结果相结合
以下是两种方法以及如何进行每种方法的一些想法:
(if n == x
then ...
else ...) ??? choose n rest
或
:
(“cons”)的工作方式,进行组合可能有点棘手
例如,从方法1开始,可能很容易写:
choose :: Int -> [Int] -> [Int]
choose n xs =
case xs of
[] -> []
x : rest -> (if n == x
then x
else ???) : choose n rest
但是你用什么来代替?
?它必须是一个数字,不能是任何数字。一种快速的方法是使用++
(“append”)而不是:
(“cons”),因为它接受两边的列表;然后,您可以使(if…
在这两种情况下都返回一个列表,或者是一个包含一个元素的列表,或者是一个包含零个元素的列表
继续进行方法2,您会得到:
choose :: Int -> [Int] -> [Int]
choose n xs =
case xs of
[] -> []
x : rest -> if n == x
then ... ??? choose n rest
else ... ??? choose n rest
在这里,在“然后…
”下使用:
不会有任何问题,因为您可以在“否则…
”中省略它
在这一点上,尝试解决该练习,并为您自己的问题提供StackOverflow答案。您以前没有问过这个问题吗?哈姆:没有,这不是为了鼓励您,而不是简单地解决问题,您可以搜索如何在Haskell中筛选列表。请参阅。你能澄清你的第二个例子吗
rep2[1,2,1,4,5,1]
似乎应该返回[2]
而不是[]
。因此,在示例2中,它必须返回[],因为没有重复的数字1。好的,谢谢,我会尝试,尽管我不太清楚???这是因为“?”由三个问号组成。这应该不是很清楚。您必须做一些调查,并思考什么可能是有意义的列表运算符(例如:
或++
),您可以将其放入“?”的插槽中。在某种程度上,你必须从寻求帮助转向进行独立调查,然后才能回头。