Haskell “a”是什么;自由变量;?
(我肯定这个问题已经在这个网站上得到了解答,但是搜索中充斥着对C中的变量调用free()的概念。) 我遇到了术语“eta减少”,它的定义类似于Haskell “a”是什么;自由变量;?,haskell,functional-programming,lambda-calculus,Haskell,Functional Programming,Lambda Calculus,(我肯定这个问题已经在这个网站上得到了解答,但是搜索中充斥着对C中的变量调用free()的概念。) 我遇到了术语“eta减少”,它的定义类似于fx=mx=>M如果x“在M中不自由”。我的意思是,我想我理解了它想说的要点,当你把一个函数转换成无点形式时,你会做什么,但是我不知道关于x不是自由的限定词是什么意思 下面是一个例子: \f -> f x 在这个lambda中,x是一个自由变量。基本上,自由变量是lambda中使用的变量,它不是lambda的参数之一(或let变量)。它来自lamb
fx=mx=>M
如果x“在M中不自由”。我的意思是,我想我理解了它想说的要点,当你把一个函数转换成无点形式时,你会做什么,但是我不知道关于x不是自由的限定词是什么意思 下面是一个例子:
\f -> f x
在这个lambda中,x
是一个自由变量。基本上,自由变量是lambda中使用的变量,它不是lambda的参数之一(或let
变量)。它来自lambda的上下文之外
Eta降低意味着我们可以改变:
(\x -> g x) to (g)
但仅当g
中的x
不是免费的(即未使用或是参数)。否则,我们将创建一个引用未知变量的表达式:
(\x -> (x+) x) to (x+) ???
好吧,不管它值多少钱
简短的版本是,此类定义使用类似“M”的占位符省略lambda表达式的主体,因此必须另外指定由该lambda绑定的变量不用于占位符表示的任何内容
因此,这里的“自由变量”大体上是指在某个模糊或未知的外部范围内定义的变量——例如,在像\y->x+y
这样的表达式中,x
是自由变量,但y
不是
Eta减少是指删除多余的绑定层并立即应用变量,这(正如您可能想象的那样)只有当所讨论的变量仅在该位置使用时才有效。次要挑剔:如果绑定了
x
,则可以使用该变量。Eta将(\x->x+x)x)
减少到(\x->x+x)
是完全可以的,尽管(\x->x+x)
包含了x
的两种用法。这是一个在处理人工编写的代码时不会出现太多的极端情况,但我想编译器会更频繁地遇到这种情况。“但仅当x
未使用时(即不免费)”应为“但仅当x
未免费时(即未使用或是参数)”。我最初是这样写的,但后来换了一种方式使它更简单。不幸的是,这改变了含义:)