【问题标题】:How to exclude a particular tuple from a list in haskell如何从haskell中的列表中排除特定的元组
【发布时间】:2018-10-08 04:01:25
【问题描述】:

我很困惑如何在下面的代码中从这个列表中过滤掉元素 (1,1)。

take 10 [ (i,j) | i <- [1,2], 
                  j <- [1..] ]
yields

[(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10)]

我的想法是使用过滤器之类的东西,但我不太确定在哪里实现它。

我的目标是Filter ((i,j) /=0) "the list"

谢谢

【问题讨论】:

  • 不要发布你的代码图片。在您的问题中包含实际代码。您可以通过选择它并按 Ctrl+k 将其突出显示为代码块。
  • deletedrop 1
  • i

标签: list haskell


【解决方案1】:

你的尝试

Filter ((i,j) /=0) "the list"

有一些问题,可以修复。

首先,该函数被称为filter。其次,它的第一个参数必须是一个函数:因此您可以使用\(i,j) -&gt; ... 将列表作为输入。第三,你想要(i,j) /= (1,1)——你不能将一对(i,j)与一个数字0进行比较。

您现在应该可以更正您的代码了。

【讨论】:

  • 感谢您的回复。
  • 我现在理解得更好了,但是过滤器应该去哪里。?。在列表理解内还是其中一个参数是列表?
  • 如果你想使用filter,那么它就是filter (predicate function) [ list comprehension ]。或者,您可以修改您的列表理解以包含过滤条件,并避免显式 filter
  • 好的,谢谢,谓词函数是规则 where (i,j) /= (1,1)
【解决方案2】:

作为使用filter 的替代方法,您还可以通过添加保护表达式(i,j) /= (1,1) 来指定不希望(1,1) 作为列表理解中的元素:

take 10 [ (i,j) | i &amp;lt- [1,2], j &amp;lt- [1..], <b>(i,j) /= (1,1)</b> ]

这类似于您编写集合推导的方式(列表推导模仿):


This answer 提供了一个很好的示例 ([x | i &lt;- [0..10], let x = i*i, x &gt; 20]),说明您可以在列表理解的末尾使用三种类型的表达式:

  • 发电机,例如。 i &lt;- [0..10] 提供值的来源。
  • 守卫,例如。 x &gt; 20 是任意谓词 - 对于来自生成器的任何给定值,只有在所有谓词都成立时,该值才会包含在结果中。
  • 本地声明,例如。 let x = i*i 执行与普通 let/where 语句相同的任务。

取自syntax reference、表达式qual的不同表达式的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多