如何理解 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 表达式的基本熟悉程度的失败,但我想发生的事情是 self
和 x
都是 __functor
的参数,也就是说,它看起来可能是一个柯里化函数。
真的,我认为 __functor
是 Haskell 中的 fmap
,而 self
(add
) 是函子本身, x: x + self.x
是 fmap
映射的函数在 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
功能,以获得对象的通常好处,包括扩展(~ 结构子类型化)和后期绑定。
我在解析这个时遇到了一些问题。但是当我写出来的时候,我想我可能会得到它。
let add = { __functor = self: x: x + self.x; };
inc = add // { x = 1; };
in inc 1
首先,self
是许多 OO 语言中的关键字还是只是一个常规名称?
其次,我试图了解 :
在 __functor
的定义中的作用,但这可能是我对 Nix 表达式的基本熟悉程度的失败,但我想发生的事情是 self
和 x
都是 __functor
的参数,也就是说,它看起来可能是一个柯里化函数。
真的,我认为 __functor
是 Haskell 中的 fmap
,而 self
(add
) 是函子本身, x: x + self.x
是 fmap
映射的函数在 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
功能,以获得对象的通常好处,包括扩展(~ 结构子类型化)和后期绑定。