在查询中使用fst和snd的Haskell过滤器

在查询中使用fst和snd的Haskell过滤器,haskell,Haskell,我是haskell的新手,我尝试过滤第一个元素大于第二个元素的所有元组。我不明白为什么这样不行,有什么帮助吗 main = do let xs = [2, 3, 2] let ys = [1, 2, 3] let cs = zip xs ys filter ((>snd).fst) cs 您可以使用以下选项进行筛选: filter (\x -> fst x > snd x) cs 但首先,您不需要使用fst或snd,您可以使用: filter(uncurr

我是haskell的新手,我尝试过滤第一个元素大于第二个元素的所有元组。我不明白为什么这样不行,有什么帮助吗

main = 
 do
  let xs = [2, 3, 2]
  let ys = [1, 2, 3]
  let cs = zip xs ys
  filter ((>snd).fst) cs
您可以使用以下选项进行筛选:

filter (\x -> fst x > snd x) cs
但首先,您不需要使用
fst
snd
,您可以使用:

filter(uncurry(>)cs
uncurry
接受函数
a->b->c
,并将其重写为接受2元组的函数
(a,b)
,从而调用包含2元组中元素的函数。

您可以使用以下方法进行筛选:

filter (\x -> fst x > snd x) cs
但首先,您不需要使用
fst
snd
,您可以使用:

filter(uncurry(>)cs

uncurry
接受一个函数
a->b->c
,并将其重写为一个接受2元组的函数
(a,b)
,从而调用包含2元组的元素的函数。

“第一个元素比第二个大”-您缺少一个比较函数。请不要使用
do
块。列表是
Monad
的一个实例,但是
main
的类型是
IO A
,所以另一个Monad是不起作用的。@LewisClark:这不起作用,因为
.fst
将提取元组的第一个元素,然后您将其与函数
snd
进行比较。但是函数不是
Ord
的实例,数字
2
也不是函数。@LEwisClarck:它是。在这种情况下,
让。。。在
中,因此
让xs=[2,3,2]在let ys=[1,2,3]在zip xs ys中
。这在
do
块之外。请用完整代码和错误消息发布正确的问题。“第一个元素大于第二个”-您缺少比较函数。请不要使用
do
块。列表是
Monad
的一个实例,但是
main
的类型是
IO A
,所以另一个Monad是不起作用的。@LewisClark:这不起作用,因为
.fst
将提取元组的第一个元素,然后您将其与函数
snd
进行比较。但是函数不是
Ord
的实例,数字
2
也不是函数。@LEwisClarck:它是。在这种情况下,
让。。。在
中,因此
让xs=[2,3,2]在let ys=[1,2,3]在zip xs ys中
。这在
do
块之外。请用完整的代码和错误消息发布正确的问题。旁注:
uncurry
在这里专门用于2元组;编写此代码的一种更灵活的方法是将应用程序实例用于函数:
(>)fst snd
;然后,如果用适当的数据类型替换了该对,则可以将其更改为另一个字段的某个字段,而要保持
未修正
,则需要先将该类型映射到一对,例如
未修正(>)。(someField&&anotherField)
。旁注:
uncurry
在这里专门用于2元组;编写此代码的一种更灵活的方法是将应用程序实例用于函数:
(>)fst snd
;然后,如果用适当的数据类型替换了该对,则可以将其更改为另一个字段的某个字段,而要保持
未修正
,则需要先将该类型映射到一对,例如
未修正(>)。(某个字段和另一个字段)