Language agnostic 调用函数和用纯函数语言实例化对象之间有关系吗?

Language agnostic 调用函数和用纯函数语言实例化对象之间有关系吗?,language-agnostic,functional-programming,lisp,immutability,Language Agnostic,Functional Programming,Lisp,Immutability,想象一种简单的(合成的)语言,其中函数如下所示: function f(a, b) = c + 42 where c = a * b struct s(a, b, c = a * b) (假设它是Lisp的一个子集,包括“defun”和“let”。) 还可以想象它包含如下不可变对象: function f(a, b) = c + 42 where c = a * b struct s(a, b, c = a * b) 同样类似于Lisp(这次是超集),假设这样的结构定义将

想象一种简单的(合成的)语言,其中函数如下所示:

function f(a, b) = c + 42
    where c = a * b
struct s(a, b, c = a * b)
(假设它是Lisp的一个子集,包括“defun”和“let”。)

还可以想象它包含如下不可变对象:

function f(a, b) = c + 42
    where c = a * b
struct s(a, b, c = a * b)
同样类似于Lisp(这次是超集),假设这样的结构定义将生成以下函数:

make-s(a, b)
s-a(s)
s-b(s)
s-c(s)
现在,考虑到简单的设置,很明显,当你调用“f”或“make-s”时,幕后发生的事情有很多相似之处。一旦在调用/实例化时提供了“a”和“b”,就有足够的信息来计算“c”

您可以将结构实例化为调用函数,然后存储生成的符号环境,以便在调用生成的访问器函数时使用。或者,您可以将函数求值视为创建一个隐藏结构,然后将其用作符号环境来求值最终结果表达式

我的玩具模型是不是太简单了,没用了?或者它实际上是一种思考真实语言如何工作的有用方式?没有CS背景但对编程语言感兴趣的人(如me)是否应该学习更多的真实语言/实现,以探索这一概念

谢谢

编辑:谢谢你的回答。更详细地说,我想我想知道的是,是否有真正的语言,学习这种语言的人会被告知,例如,“你应该把对象看作本质上的闭包”。或者,如果有任何实际的语言实现,在这种情况下,实例化对象和调用函数实际上共享一些常见的(非平凡的,即不仅仅是库调用)代码或数据结构


我所做的类比(我知道其他人以前也做过类似的类比)是否比任何实际情况下的类比更深入?

对象和闭包之间存在关系

以下内容创建了一些人可能会调用函数,而另一些人可能会调用对象:
取自SICP()

我的玩具模型是不是太简单了,没用了


基本上,是的。您的简化模型基本上可以归结为,这些操作中的每一个都涉及到执行计算并将结果放在某个地方。但这是如此普遍,它涵盖了计算机所做的一切。如果不执行计算,就不会做任何有用的事情。如果你没有把结果放在某个地方,你会白白做工作,因为你没有办法得到结果。因此,任何对计算机有用的操作,从添加两个寄存器到获取网页,都可以建模为执行计算并将结果放在以后可以访问的地方。

没有比lambda演算更纯粹的了:。Lambda演算实际上是如此纯粹,它只有函数

在lambda演算中实现配对的标准方法如下:

pair = fn a: fn b: fn x: x a b
first = fn a: fn b: a
second = fn a: fn b: b
因此,
pairabb
,您可以称之为“struct”,实际上是一个函数(
fnx:xab
)。但它是一种特殊类型的函数,称为闭包。闭包本质上是一个函数(
fnx:xab
)加上所有“自由”变量的值(在这种情况下,
A
b

是的,实例化一个“结构”就像调用一个函数,但更重要的是,实际的“结构”本身就像一个特殊类型的函数(闭包)

如果您考虑如何实现lambda演算解释器,您可以从另一面看到对称性:您可以将闭包实现为表达式加上包含所有自由变量值的结构


很抱歉,如果这是显而易见的,而您只是想要一些真实世界的示例…

这两个
f
make-s
都是函数,但相似性并没有太大。应用
f
调用函数并执行其代码;应用
make-s
创建一个结构

在大多数语言实现和建模中,
make-s
是一种不同于
f
的对象:
f
是一个闭包,而
make-s
是一个构造函数(在函数式语言和逻辑意义中,它接近于面向对象语言的意义)

如果您喜欢以面向对象的方式思考,那么
f
make-s
都有一个apply方法,但它们对该方法有完全不同的实现

如果您想从底层逻辑的角度考虑,
f
make-s
在samme类型构造函数(函数类型构造函数)上有一个类型构建,但它们以不同的方式构建,并且具有不同的销毁规则(函数应用程序与构造函数应用程序)


如果你想了解最后一段,我推荐本杰明·C·皮尔斯。结构在§11.8中进行了讨论。

当然,这里有一个类比
make-s
可视为工厂,根据定义,工厂是一种功能。我确实发现,将方法(包括工厂/构造函数)视为函数,将函数的作用域视为符号(/string)=>值映射是一件有趣的事情,尽管这与我的fu编码不太相关。Python同时做这两件事+1因为我喜欢谈论这些事情。有点相关:谢谢你的链接。我知道对象和闭包之间有相似之处。请看我对问题的编辑,但我想知道它是否比类比更深入,至少对于实例化不可变对象和调用函数之间的关系来说是这样。这个答案和z5h都对我有帮助,但请看我编辑的问题和我对z5h答案的评论。很明显,你所描述的类比是无用的。但我试图把它限制在immuta的实例化上