【问题标题】:How to run a function on a lambda parameter to be used in a nested lambda in Haskell?如何在 lambda 参数上运行函数以在 Haskell 的嵌套 lambda 中使用?
【发布时间】: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 xy 提供输入以进行评估。

实际代码如下:

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


【解决方案1】:

你在这里调用 (\y -> ...) 参数 f

filter (\x -> (\y -> 
  fromJust (accessorFunc0 y) == foo && compareFunc bar (accessorFun1 y)) f . g) $ accessorFun2 dataStruc

另外,\x -> 也无济于事,因为组合已经产生了一个函数。

您可能正在寻找类似的东西

filter (
  (\y -> fromJust (accessorFunc0 y) == foo && compareFunc bar (accessorFun1 y))
  . f
  . g) $ accessorFun2 dataStruc

其中f\y -> ... 组成,而不是作为参数传递。

注意fromJust 是不完整的,它会使Nothing 上的程序崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多