haskell中列表理解中的使用条件

haskell中列表理解中的使用条件,haskell,list-comprehension,higher-order-functions,Haskell,List Comprehension,Higher Order Functions,我想使用列表理解只打印true listTo::(a->b)->[a]->[b] listTo f list=[f(x)|x<-list,x==True] isTrue::Int->Bool isTrue n |n>=5 =True |n<5 =False listTo isTrue[1,2,3,4,5,6,7] listTo::(a->b)->[a]->[b] listtof list=[f(x)| xBool 伊斯特鲁 |n>

我想使用列表理解只打印true

listTo::(a->b)->[a]->[b]
listTo f list=[f(x)|x<-list,x==True]

isTrue::Int->Bool
isTrue n
    |n>=5 =True
    |n<5 =False


listTo isTrue[1,2,3,4,5,6,7]
listTo::(a->b)->[a]->[b]
listtof list=[f(x)| xBool
伊斯特鲁
|n> =5=正确

|n在
listTo
中,
list
的类型为
[a]
。因此
x
的类型为
a
。但随后您将比较
x==True
,这意味着
x
应该具有类型
Bool
,这是一个矛盾

如果您将类型签名更改为
listTo:(Bool->b)->[Bool]->[b]
,它将编译。但是,您将无法将其与
listTo一起使用,因为
[1,2,3,4,5,6,7]
显然不是
[Bool]
类型


我不清楚这个代码应该做什么,但是你应该查看使用<代码> MAP>代码>或<代码>过滤器> />代码>

你应该真正考虑使用<代码>过滤器< /代码>,像这样:

filter isTrue [1,2,3,4,5,6,7]
但是我们可以进一步改进。
=
是一个函数,它接受两个参数,如果它们相等,则返回
True
,如果它们不相等,则返回
False
。因此
fx==True
将返回
True
如果
fx
True
,如果
fx
False
。似乎是浪费精力;您可以只编写
fx

[x | x <- list, f x]

[x | x您正在将x(类型a)与True(Bool)进行比较,以备将来参考。如果给出了“这不起作用”的更详细信息,则问题更容易回答。它是否无法编译(如果是,错误消息是什么)?它是否产生了错误的结果?如果它起作用,您希望得到什么结果?
[x | x <- list, f x == True]
[x | x <- list, f x]