【发布时间】:2020-09-16 19:12:00
【问题描述】:
背景(来自 cmets):
我不想每个元素对两个条件(即\x -> f (g x) == .. && f (g x) == ..)使用相同的函数两次,所以我试图找到一种方法来执行\y -> y == .. && y -> == .. where y = f (g x)。
原帖:
我想过滤一个列表,该列表需要在测试多个条件之前对每个元素运行函数。
我想按照这个结构创建一个表达式:
filter (\x -> (\y -> y == cond0 && y == cond1) f . g) $ ..
f . g x 向y 提供输入以进行评估。
实际代码如下:
filter (\x -> (\y ->
fromJust (accessorFunc0 y) == foo && compareFunc bar (accessorFun1 y)) f . g) $ accessorFun2 dataStruc
但我也试过:
filter ((\x ->
fromJust (accessorFunc0 y) == foo && compareFunc bar (accessorFun1 y)) f . g) $ accessorFun2 dataStruc
这也会产生编译器错误。
非常感谢任何帮助!
【问题讨论】:
-
我不清楚您要做什么。但根本的问题是,在
filter (\x -> whatever)中,whatever必须是 boolean 表达式。而你所拥有的,无论“内部 lambda”中有什么,目前都必然是一个 函数,因为它使用组合运算符.。 -
您能否详细说明您正在解决的特定问题?这有助于澄清您的问题。
-
我不想为两个条件,即
\x -> f (g x) == .. && f (g x) == ..,每个元素使用相同的函数两次,所以我试图找到一种方法来做\y -> y == .. && y -> == ..y = f (g x) -
你的意思是
(\x -> (\y -> y == cond0 && y == cond1) . f . g $ x)。写成(\y -> y == cond0 && y == cond1) . f . g)更短(正如@chi 的答案所示),但写成(\x -> let { y = f (g x) } in y == cond0 && y == cond1)更容易、更清晰、更简单。所以,简短的回答是,使用let。
标签: haskell lambda conditional-statements filtering anonymous-function