如何理解 Nix 表达式语言中的函子?

How to undestand functors in the Nix expression language?

我在解析这个时遇到了一些问题。但是当我写出来的时候,我想我可能会得到它。

let add = { __functor = self: x: x + self.x; };
    inc = add // { x = 1; };
in inc 1

首先,self 是许多 OO 语言中的关键字还是只是一个常规名称?

其次,我试图了解 :__functor 的定义中的作用,但这可能是我对 Nix 表达式的基本熟悉程度的失败,但我想发生的事情是 selfx 都是 __functor 的参数,也就是说,它看起来可能是一个柯里化函数。

真的,我认为 __functor 是 Haskell 中的 fmap,而 self (add) 是函子本身, x: x + self.xfmap 映射的函数在 Haskell.

中的意思

self不是关键字,只是一个普通的参数名。 __functor 的右侧是两个参数的柯里化函数,这是正确的。 Nix 解释器确保 __functor 在调用站点 inc 1 传递给 self 的适当值; __functor 被特殊处理,即使它本身不是关键字。

您的示例与以下内容几乎相同: let add = a: b: a + b inc = add 1 in inc 1 在较大的程序中,能够在其他地方覆盖 add.x 可能很有用。

如评论中所述,Nix 在可以像函数一样在句法上使用的对象(此处为集合)的意义上使用 "functor"。

以这种方式传递 self 是 Nix 的 "Objects are closures" 版本。该技术在 Nixpkgs 中的许多地方使用,有和没有 __functor 功能,以获得对象的通常好处,包括扩展(~ 结构子类型化)和后期绑定。