gpt4 book ai didi

haskell - 数据修改的 Eta 减少

转载 作者:行者123 更新时间:2023-12-05 00:59:39 24 4
gpt4 key购买 nike

我收到 eta 减少以下 lambda 表达式的警告。

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

互联网告诉我减少 eta 的方法是省去不必要的 lambda。
map (\x -> fun x) list
map fun list

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

最佳答案

对于这种情况,您不能进一步减少它。 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 中)。

您可以应用的另一条规则是处理 $ 时运算符(operator)。简单地说,如果你有类似的东西
\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

一般来说,你通常可以交换 $ s 为 . s 并删除最后一个参数。

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

关于haskell - 数据修改的 Eta 减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30485219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com