我对如何从下面的代码中的此列表中过滤掉元素(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"
由于
答案 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) ]
这类似于你如何编写集合理解(列表理解模仿):
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
的不同表达式的名称。