在查询中使用fst和snd的Haskell过滤器
我是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
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
;然后,如果用适当的数据类型替换了该对,则可以将其更改为另一个字段的某个字段,而要保持未修正
,则需要先将该类型映射到一对,例如未修正(>)。(某个字段和另一个字段)
。