Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell “a”是什么;自由变量;?_Haskell_Functional Programming_Lambda Calculus - Fatal编程技术网

Haskell “a”是什么;自由变量;?

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

(我肯定这个问题已经在这个网站上得到了解答,但是搜索中充斥着对C中的变量调用free()的概念。)

我遇到了术语“eta减少”,它的定义类似于
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
未免费时(即未使用或是参数)”。我最初是这样写的,但后来换了一种方式使它更简单。不幸的是,这改变了含义:)