首页 > 解决方案 > 如何在 lambda 参数上运行函数以在 Haskell 的嵌套 lambda 中使用?

问题描述

背景(来自评论):

对于两个条件,我不想每个元素使用相同的函数两次,\x -> f (g x) == .. && f (g x) == ..所以我试图找到一种方法来做\y -> y == .. && y -> == ..where y = f (g x)

原帖:

我想过滤一个列表,该列表需要在测试多个条件之前对每个元素运行函数。

我想创建一个遵循这个结构的表达式:

filter (\x -> (\y -> y == cond0 && y == cond1) f . g) $ ..

where为评估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

这也会产生编译器错误。

任何帮助深表感谢!

标签: haskelllambdaconditional-statementsfilteringanonymous-function

解决方案


您在这里使用参数调用 (\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

wheref由 with\y -> ...而不是作为参数传递。

当心那fromJust是部分的,并且会使程序在Nothing.


推荐阅读