[英]Using condition in list comprehension in haskell
我想使用list comprehension只打印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]
但这不起作用。 为什么?
您应该考虑使用filter
,如下所示:
filter isTrue [1,2,3,4,5,6,7]
[f(x)|x<-list,x==True]
这说“给我一个fx
1列表,其中x
来自list
, x
等于True
。
但对于您的情况,您已将list
作为数字列表传递。 看起来你只想包含那些fx
返回True
数字。 因此,不是将x
与True
和发射fx
进行比较,而是应该做相反的事情。 更像是:
[x | x <- list, f x == True]
但我们可以进一步改善这一点。 ==
是一个带有两个参数的函数,如果它们相等则返回True
如果不相等则返回False
。 所以fx == True
打算返回True
,如果fx
为True
,且False
如果fx
是False
。 似乎是浪费精力; 你可以写fx
!
[x | x <- list, f x]
这就是你如何使用列表理解来做到这一点。 但正如邮递员指出的那样,已经有一个标准的库函数来完成这个: filter
。 如果您正在编写代码来完成工作,而不是了解工作原理,那么您将使用它。
1请注意, f(x)
仅被解析为应用于带括号的子表达式(x)
f
。 将括号括在x
周围没有任何作用,因此它完全等同于fx
。 Haskell的函数应用语法不是类似C的function(arg1, arg2, arg3)
,而是function arg1 arg2
,其中参数只是在函数之后写出(必要时用空格分隔)。 括号仅用于控制优先级和形成元组。 如果您开始尝试通过在参数列表周围加上括号来调用多个参数上的函数,那么您将遇到更多错误。
在listTo
, list
有类型[a]
。 因此x
具有类型a
。 但是你要比较x == True
,这意味着x
应该有类型Bool
- 一个矛盾。
如果你将类型签名更改为listTo :: (Bool -> b) -> [Bool] -> [b]
,它会编译。 但是,您将无法使用listTo isTrue [1,2,3,4,5,6,7]
因为[1,2,3,4,5,6,7]
显然不属于类型[Bool]
。
我不完全清楚这段代码应该做什么,但你应该考虑使用map
或filter
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.