lambda演算对返回值有什么看法?

Ari*_*man 12 r lambda-calculus return-value

现在是lambda演算的一个众所周知的定理,任何带有两个或多个参数的函数都可以通过currying作为一个带有一个参数的函数链来编写:

# Pseudo-code for currying
f(x,y) -> f_curried(x)(y)
Run Code Online (Sandbox Code Playgroud)

事实证明,这不仅在研究函数的行为方面,而且在实际应用中都非常强大(Haskell等).

但是,似乎没有讨论返回值的函数.程序员通常通过返回一些元对象(R中的列表,C++中的结构等)来处理它们无法从函数返回多个值.它总是让我觉得有点像一个kludge,但它是一个有用的.

例如:

# R code for "faking" multiple return values
uselessFunc <- function(dat) {
   model1 <- lm( y ~ x , data=dat )
   return( list( coef=coef(model1), form=formula(model1) ) )
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. lambda演算有多少关于多重返回值的说法吗?如果是这样,会得出任何令人惊讶的结论吗?
  2. 同样,任何语言都允许真正的多重返回值吗?

Ósc*_*pez 5

根据关于lambda演算的维基百科页面:

Lambda演算也写成λ演算,是函数定义,函数应用和递归的形式系统

和数学意义上的函数:

关联一个数量,函数的参数,也称为输入,与另一个数量,函数的值,也称为输出

所以回答你的第一个问题不,lambda演算(或任何其他基于数学函数的形式)不能有多个返回值.

对于你的第二个问题,据我所知,实现多个返回值的编程语言是通过将多个结果打包到某种数据结构(无论是元组,数组,甚至堆栈)然后再解压缩来实现的.这就是差异所在,因为一些编程语言使得打包/解包部分对程序员是透明的(例如Python使用引擎盖下的元组),而其他语言使程序员明确地完成工作,例如Java程序员可以模拟多个返回通过在返回的Object数组中打包多个结果然后手动提取和转换返回的结果,可以在某种程度上获得值.

  • 在最纯粹的意义上,lambda演算不允许函数有多个输入值 - 这就是我们使用currying来"模拟"多个输入值的原因 (2认同)