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

时间:2018-06-22 19:55:32

标签: haskell category-theory nix

我在解析此文件时遇到了一些麻烦。但是当我写出来的时候,我想我可能会拥有它。

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

首先,self是像许多OO语言中一样的关键字吗?还是仅仅是普通名称?

其次,我试图了解:定义中的多个__functor在做什么,但是这可能是我对Nix表达式的基本熟悉的失败,但是我想这是什么发生的情况是selfx都是__functor的参数,也就是说,它看起来像是一个咖喱函数。

实际上,__functor就是fmap在Haskell中的样子,selfadd)是函子本身,{{1} }是x: x + self.x映射的函数在Haskell中的作用。

1 个答案:

答案 0 :(得分:1)

self不是关键字,而只是普通的参数名称。您正确的认为__functor的右侧是两个参数的一个经过咖喱的函数。 Nix解释器确保在呼叫站点__functorself传递inc 1的适当值; __functor是经过特殊处理的,即使它本身不是关键字。

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

如注释中所述,Nix在对象(这里是集合)的意义上使用“ functor”,该对象可以像函数一样在语法上使用。

以这种方式传递self是Nix的“对象就是闭包”版本。这项技术在Nixpkgs中的很多地方都使用,带有和不带有__functor功能,以获得对象的通常好处,包括扩展(〜结构子类型化)和后期绑定。