bba*_*ker 5 haskell category-theory nix
我在解析这个问题时遇到了一些麻烦。但当我把它写出来时,我想我可能拥有它。
let add = { __functor = self: x: x + self.x; };
inc = add // { x = 1; };
in inc 1
Run Code Online (Sandbox Code Playgroud)
首先,是self像许多面向对象语言中那样的关键字还是只是一个常规名称?
其次,我试图理解 的:定义中的倍数在做什么__functor,但这可能是我对 Nix 表达式基本熟悉的失败,但我想发生的事情是 和self都是x参数__functor,即,它看起来就像它可能是一个柯里化函数。
所以实际上,我认为__functor这就是fmapHaskell 中的内容,并且self( add) 是函子本身,并且是Haskell 中x: x + self.x映射的函数。fmap
self不是关键字,只是一个普通的参数名称。您是正确的, 的 右侧__functor是两个参数的柯里化函数。Nix 解释器确保在调用站点__functor为 , 传递适当的值;即使它本身不是关键字,也会进行特殊处理。selfinc 1__functor
您的示例几乎与以下内容相同:
let add = a: b: a + b
inc = add 1
in inc 1
在较大的程序中,能够add.x在其他地方覆盖可能会很有用。
正如评论中所指出的,Nix 在对象(此处为集合)的意义上使用“函子”,该对象在语法上可以像函数一样使用。
通过self这种方式是 Nix 版本的“对象是闭包”。该技术在 Nixpkgs 中的许多地方使用,无论有或没有该__functor功能,以获得对象的通常好处,包括扩展(〜结构子类型)和后期绑定。