减少数据修改的Eta

时间:2015-05-27 14:18:37

标签: haskell lambda

我收到一个警告,要求减少以下lambda表达式。

\(DataType arg1 arg2) -> DataType (modify arg1) arg2

互联网告诉我减少意味着省去不必要的羔羊。

map (\x -> fun x) list
map fun list

这如何适用于上述代码?我可能只是缺少修改数据类型的基本语法吗?

1 个答案:

答案 0 :(得分:5)

对于这种情况,您不能再进一步减少它。 lambda只有一个参数,即(DataType arg1 arg2)。这些不是单独的参数,如括号所示,而是在构造函数上进行模式匹配。实际上,编译器会将此表达式减少为更像

的表达式
\arg -> case arg of
    DataType arg1 arg2 -> DataType (modify arg1) arg2

这里更清楚的是lambda只有一个参数,并没有以可以减少的方式使用它。减少的主要规则是当你有类似

之类的东西时
\a b c -> f b a c

c参数显示为参数声明和表达式中的最后一个术语,因此可以将其删除:

\a b -> f b a

现在,如果我们想减少这个lambda,我们可以定义一个更高阶函数

flip f a b = f b a

简单地将其写成

flip f

(请注意flip)中已存在Prelude

您可以应用的另一个规则是处理$运算符时。简而言之,如果你有像

这样的东西
\a b c -> f a $ g b $ h c

然后你可以先把它变成一个作文:

\a b c -> (f a . g b . h) c

现在删除c参数

很简单
\a b -> f a . g b . h

通常,您通常可以将$换成.并删除最后一个参数。

同样,这并不适用于你的情况,因为你的函数只有1个参数,并且该参数是模式匹配的,用于提取构造函数的参数,然后从中重构一个全新的值