如何在Haskell的嵌套lambda中使用的lambda参数上运行函数?

问题描述

背景(摘自评论):

对于两个条件(即\x -> f (g x) == .. && f (g x) == ..),我不想每个元素都使用相同的函数两次,所以我试图找到一种方法\y -> y == .. && y -> == ..,其中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

这也会产生编译器错误。

非常感谢您的帮助!

解决方法

您在此处使用参数f调用(\ y-> ...):

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上的程序崩溃。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...