gpt4 book ai didi

haskell - 在严格的、不纯粹的语言中,柯里化(Currying)/偏应用如何工作?

转载 作者:行者123 更新时间:2023-12-02 18:01:33 25 4
gpt4 key购买 nike

首先,我并不完全熟悉所讨论的概念,所以如果我误用了任何术语,请原谅我。我想知道的是,如果我有类似的东西:

int someGlobal = 7;
int sumThree(int a, int b){
return (a + b + someGlobal);
}

如果可以通过调用 sumThree(3) 来部分应用/柯里化(Currying)该函数,那么这会被转换为等价的:

int sumThree(int b){
return (3 + b + someGlobal);
}

或进入:

int sumThree(int b){
return (3 + b + 7); //or, return (10+b)
}

其中一个会“更正确”吗?或者,如果它们只是同一事物的不同形式,那么人们会使用什么术语来区分它们两者?上述两段代码的不同之处在于,如果在调用 sumThree(3) 之后但在应用函数的其余部分之前更改 someGlobal 的值,则前者将产生与后者不同的结果,因为后者在调用 sumThree(3) 时捕获 someGlobal 的值 (7)。

最佳答案

部分应用程序如何在不纯的语言中工作?不太好:-P

抛开笑话不谈,不纯语言中的闭包何时被允许引用可变变量是很难推理的。例如:

x = 0;
f = function (y) { return x+y; }
x = 1;
y = f(10); // 10 or 11 ?

上述问题没有“正确”答案:10 和 11 都是合理的结果,程序员必须知道手头的编程语言会采取哪一个。例如,Java 不允许使用上述代码(与 Java 等效的代码)。 Java允许代替(相当于)

x = 0;
const xc = x;
f = function (y) { return xc+y; }
x = 1;
y = f(10); // 10

因为这里没有歧义:xc是一个const,所以它在闭包构造时的值将与闭包应用程序时的值相同。 Java 规则比要求所有捕获的变量都是常量稍微宽松一些。

此外,请注意,这个问题不仅仅是理论上的。博客文章 Closing over the loop variable considered harmful显示了 C# 的语义最近更改是因为程序员遇到了问题。

Ocaml 是不纯粹的,但在使用 ref 类型时可以部分缓解该问题。如果x:int ref那么

let f1 = fun y -> !x + y

将在应用程序时使用x的值,而

let f2 = let xv = !x in fun y -> xv + y

将在关闭时使用x的值。

最后,C++11选择了allowing many kinds of captures :您可以捕获变量值(如上面的 f2 中)或变量引用(如 f1 中)。

关于haskell - 在严格的、不纯粹的语言中,柯里化(Currying)/偏应用如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23196009/

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