我将使用精彩的图书馆 https:/tpolecat.github.iodoobie。 而且功能齐全。
我正在通过 首例 和我已经认识到了。
Transactor是一种数据类型,它知道如何连接到数据库,如何发出连接,如何清理它们;有了这些知识,它就可以转化为:
ConnectionIO ~> IO
,这就给了我们一个可以运行的程序。
ConnectionIO ~> IO
是范畴理论中的自然转换,但一直没有完全理解,自然转换到底是什么。
但是,我知道它是从一个类别转化到另一个类别。例如
F[A] ~> G[A]
是一个自然转换,从一个类别 F
到 G
而不改变内容。
并不是所有的东西都可以自然转化,问题是,图书馆的作者dobie怎么知道,他可以做到从自然转化为 ConnectionIO ~> IO
?
我知道它[自然转换]就是从一个类别转换到另一个类别。
其实不是。从类别到类别的转换是漏子(它把对象映射到对象,把形态映射到形态)。自然转换是由漏子到漏子的转换(即它是漏子类别中的变形)。
Scala中的类型类别是一个 种类. 它的对象是类型,它的 词形 是函数(不是函数类型)。
例如 List
和 Option
是 向量. 它们将对象映射到对象上(类型 A
键入 List[A]
种类 A
键入 Option[A]
)和形变到形变(函数 f: A => B
运作 _.map(f) : List[A] => List[B]
职能 f: A => B
运作 _.map(f) : Option[A] => Option[B]
).
例如 headOption
是一个 自然流变 (List ~> Option
)
val headOption: (List ~> Option) = new (List ~> Option) {
def apply[A](as: List[A]): Option[A] = as.headOption
}
或在Dotty
val headOption: [A] => List[A] => Option[A] =
[A] => (as: List[A]) => as.headOption
有一个不断发展的抽象序列。
https:/github.comhmemcpymilewski-ctfp-pdfreleasestagv1.3.0。
https:/www.youtube.complaylist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_
并不是所有的东西都可以自然转化,问题是,图书馆道友的笔者怎么知道,他可以做到从自然转化为
ConnectionIO ~> IO
?
其实如果你有地图家族 ConnectionIO[A] => IO[A]
(A
贯穿所有类型)而这个家族 是用参数多态性定义的 而不是特设多态性,即类型类,即是在没有附加假设的情况下,对类型进行定义的 A
) = 参数性那么自然性就 "免费 "地从参数性中得出。这是 "免费定理 "之一
https:/bartoszmilewski.com20140922parametricity-money-for-nothing-and-theorems-for-free。
https:/www.reddit.comrhaskellquestionscomments6fkufofree_theorems