Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 我在haskell有一个练习,我需要帮助纠正它_List_Haskell - Fatal编程技术网

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。好的,谢谢,我会尝试,尽管我不太清楚???这是因为“?”由三个问号组成。这应该不是很清楚。您必须做一些调查,并思考什么可能是有意义的列表运算符(例如
    ++
    ),您可以将其放入“?”的插槽中。在某种程度上,你必须从寻求帮助转向进行独立调查,然后才能回头。