haskell中列表理解中的使用条件
我想使用列表理解只打印truehaskell中列表理解中的使用条件,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>
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]