繁体   English   中英

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

[英]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来自listx等于True

但对于您的情况,您已将list作为数字列表传递。 看起来你只想包含那些fx返回True数字。 因此,不是将xTrue和发射fx进行比较,而是应该做相反的事情。 更像是:

[x | x <- list, f x == True]

但我们可以进一步改善这一点。 ==是一个带有两个参数的函数,如果它们相等则返回True如果不相等则返回False 所以fx == True打算返回True ,如果fxTrue ,且False如果fxFalse 似乎是浪费精力; 你可以写fx

[x | x <- list, f x]

这就是你如何使用列表理解来做到这一点。 但正如邮递员指出的那样,已经有一个标准的库函数来完成这个: filter 如果您正在编写代码来完成工作,而不是了解工作原理,那么您将使用它。


1请注意, f(x)仅被解析为应用于带括号的子表达式(x) f 将括号括在x周围没有任何作用,因此它完全等同于fx Haskell的函数应用语法不是类似C的function(arg1, arg2, arg3) ,而是function arg1 arg2 ,其中参数只是在函数之后写出(必要时用空格分隔)。 括号用于控制优先级和形成元组。 如果您开始尝试通过在参数列表周围加上括号来调用多个参数上的函数,那么您将遇到更多错误。

listTolist有类型[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]

我不完全清楚这段代码应该做什么,但你应该考虑使用mapfilter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM