如何从haskell中的列表中排除特定元组

时间:2018-04-27 10:12:14

标签: list haskell

我对如何从下面的代码中的此列表中过滤掉元素(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"

由于

2 个答案:

答案 0 :(得分:0)

您的尝试

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

有一些问题,可以修复。

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

您现在应该能够更正您的代码了。

答案 1 :(得分:0)

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

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

这类似于你如何编写集合理解(列表理解模仿):

enter image description here

This answer给出了一个很好的示例([x | i <- [0..10], let x = i*i, x > 20]),你可以在列表理解的尾端有三种类型的表达式:

  • 发电机,例如。 i <- [0..10]提供了价值来源。
  • 卫兵,例如。 x > 20是任意谓词 - 对于来自生成器的任何给定值,如果所有谓词都成立,则该值将仅包含在结果中。
  • 当地声明,例如。 let x = i*i执行与普通let / where语句相同的任务。

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