Data.Functor.Invariant
文档(重点是我的):
一种函子类型,可用于调整包装函数的类型,其中 参数化类型同时出现在 positive 和 negative 位置,例如
。
F (a -> a)
上面的术语“正”和“负位置”指的是什么?
..并且还想知道为什么
F (a -> a)
需要一种全新类型的函子,但这可能应该是另一个问题..
我试图通过更多地了解不变函子并查找与函数式编程相关的术语“正”、“负”来解决这个问题,但还无法将这些点联系起来。有没有我错过的基本资源?或者,至少应该从哪里开始理解这些概念? (甚至不确定正确的主题是什么;请参阅下面我的研究尝试。)
从搜索结果中 “不变函子正负” ,“正不变极性与负不变极性” , “类型理论正负极性不变量” ,和“什么是不变函子”:
[
nLab
] 类型论中的极性
我的直觉告诉我这就是答案 - 但我的数学/逻辑背景太少,无法理解其中的大部分内容(以及了解我所做的部分如何与我的问题联系起来)。
[
blog
] 类型理论中的极性
一样。
[
stackoverflow
] 不变函子的示例?
答案确实提到了“积极”和“消极”这两个词,但没有解释它们,链接的资源也没有解释。它确实提到了“HOAS”,
[
google search
] 高阶抽象语法 HOAS
但它看起来不像我要找的。
[
hackage
] layers
包文档
-> 不变函子
即使它是相关的,我也不明白......
[
ploeh blog
] 不变函子和函子作为不变函子
没有提到“积极”或“消极”,但这些帖子确实让我看到了Mark Seemann的文章系列函子、应用程序和朋友,看起来引人注目且全面,但到目前为止我没有找到任何东西那里要么(或者我错过了..)
[
nLab
] 不变
嗯,就在我头顶上方...
我不知道这个术语从何而来,但它是一种分析参数多态类型的方法,以确定它是协变、逆变还是不变。
FWIW,我发现Thinking with Types(第 3 章)中给出的解释非常有用且易于理解。这是一个很短的章节(只有六页),但仍然太长,无法在这里复制(此外,我会侵犯作者的版权)。不过,事情的要点是
“仅出现在正位置的类型变量是协变的。仅出现在负位置的类型变量是逆变的。而同时出现在两者中的类型变量则成为不变的。”
对于像
a -> b
这样的简单函数类型,a
处于负位置,b
处于正位置。因此,a -> b
在 b
中是协变的,但在 a
中是逆变的。
不过,还有更多内容,因为如何分析像
(Int -> a) -> Int
或 (a -> Int) -> Int
(书中的示例)这样的类型?
寻找此类问题的答案涉及到一些易于理解的代数,正负位置的概念对此有所帮助。
需要明确的是,我与桑迪·马奎尔没有任何关系; 我只是喜欢这本书。我确信这种分析来自其他地方,但是(如果我对这本书有一点抱怨的话),桑迪·马奎尔没有提供引用。