【发布时间】:2020-05-22 17:07:10
【问题描述】:
我将使用很棒的库https://tpolecat.github.io/doobie/,它功能齐全。
我正在通过first example 并且我认出了:
Transactor 是一种知道如何连接到数据库的数据类型, 分发连接,并清理它们;有了这些知识 可以转换
ConnectionIO ~> IO,这给了我们一个可以运行的程序。
ConnectionIO ~> IO是范畴论中的自然变换,但一直没有完全理解,究竟什么是自然变换。
但是,我知道这是从一个类别到另一个类别的转变。例如:
F[A] ~> G[A]
是从类别F 到G 的自然转换,而不更改内容。
不是所有东西都可以自然转化,问题是library doobie的作者怎么知道,他可以从ConnectionIO ~> IO进行自然转化?
【问题讨论】:
-
但是,我知道这是从一个类别到另一个类别的转换。 不。从类别到类别的转换是函子(它将对象映射到对象,态射到态射)。自然转换是从函子到函子的转换(即它是函子范畴中的态射)。
-
如果
F和G是Functors,任何forall a. F a -> G a函数都是从F到G的自然转换。 (我使用的是 Haskell 表示法,但这在 Scala-Cats 中同样有效。) -
@duplode 是对的,我也是这么想的,很简单。如果您查看类别理论定义,您会看到很多额外的东西,但这只是表达“它必须将类型
a视为 opaque 并且不能,例如,当a是Int时例外。这也称为参数性,或(喘气!)自然性 -
我不确定这是否过于简化,但如果有一个函数
nt在所涉及的仿函数F和G的类型参数中是多态的,并且它确实不违反交换律(伪代码)nt(mapOfF(f) (functorF)) == mapOfG(f) (nt(functorG))那么nt是F和G之间的同态或自然变换。 -
@DmytroMitin 你找不到。这里是a proof
标签: scala haskell functional-programming category-theory parametric-polymorphism