Als*_*ton 3 haskell list-comprehension higher-order-functions
我想使用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]
Run Code Online (Sandbox Code Playgroud)
但这不起作用.为什么?
[f(x)|x<-list,x==True]
Run Code Online (Sandbox Code Playgroud)
这说“给我一个f x1的列表,它x来自哪里list并且x等于True.
但是对于您的情况,您已list作为数字列表传递。看起来您只想包括那些f x返回的数字True。因此,而不是比较x反对True和发光f x,你应该做的正好相反。更像是:
[x | x <- list, f x == True]
Run Code Online (Sandbox Code Playgroud)
但是我们可以进一步改进这一点。==是一个函数,它接受两个参数并True在它们相等时返回,如果它们不相等False则返回。所以f x == True将返回Trueif f xisTrue和Falseif f xis False。似乎是白费力气;你可以写f x!
[x | x <- list, f x]
Run Code Online (Sandbox Code Playgroud)
所以这就是你如何使用列表理解来做到这一点。但作为邮差指出,已经有一个标准库函数来做到这一点:filter。如果您正在编写代码来完成工作,而不是学习事情是如何工作的,那么这就是您将使用的内容。
1请注意,f(x)它只是被解析为f应用于带括号的子表达式(x)。把括号放在周围x什么都不做,所以这完全等同于f x. Haskell 的函数应用语法不是类似 C 的function(arg1, arg2, arg3),而是function arg1 arg2,其中参数简单地写在函数之后(必要时用空格分隔)。括号仅用于控制优先级和形成元组。如果您开始尝试通过在参数列表周围放置括号来尝试对多个参数调用函数,您将遇到更多错误。