我在解析此文件时遇到了一些麻烦。但是当我写出来的时候,我想我可能会拥有它。
let add = { __functor = self: x: x + self.x; };
inc = add // { x = 1; };
in inc 1
首先,self
是像许多OO语言中一样的关键字吗?还是仅仅是普通名称?
其次,我试图了解:
定义中的多个__functor
在做什么,但是这可能是我对Nix表达式的基本熟悉的失败,但是我想这是什么发生的情况是self
和x
都是__functor
的参数,也就是说,它看起来像是一个咖喱函数。
实际上,__functor
就是fmap
在Haskell中的样子,self
(add
)是函子本身,{{1} }是x: x + self.x
映射的函数在Haskell中的作用。
答案 0 :(得分:1)
self
不是关键字,而只是普通的参数名称。您正确的认为__functor
的右侧是两个参数的一个经过咖喱的函数。 Nix解释器确保在呼叫站点__functor
为self
传递inc 1
的适当值; __functor
是经过特殊处理的,即使它本身不是关键字。
您的示例几乎与以下示例相同:
let add = a: b: a + b
inc = add 1
in inc 1
在更大的程序中,能够在其他地方覆盖add.x
可能会很有用。
如注释中所述,Nix在对象(这里是集合)的意义上使用“ functor”,该对象可以像函数一样在语法上使用。
以这种方式传递self
是Nix的“对象就是闭包”版本。这项技术在Nixpkgs中的很多地方都使用,带有和不带有__functor
功能,以获得对象的通常好处,包括扩展(〜结构子类型化)和后期绑定。