zer*_*ing 6 haskell functional-programming scala category-theory parametric-polymorphism
我将使用很棒的库https://tpolecat.github.io/doobie/,它功能齐全。
我正在经历第一个例子,我已经认识到:
Transactor 是一种数据类型,它知道如何连接到数据库、分发连接并清理它们;有了这些知识,它可以转换
ConnectionIO ~> IO
,这给了我们一个可以运行的程序。
ConnectionIO ~> IO
是范畴论中的自然变换,但从未完全理解,究竟什么是自然变换。
但是,我知道这是从一类到另一类的转变。例如:
F[A] ~> G[A]
Run Code Online (Sandbox Code Playgroud)
是从类别F
到G
不改变内容的自然转变。
并非一切都可以自然转化,问题是,library doobie 的作者怎么知道,他可以从 进行自然转化ConnectionIO ~> IO
?
我知道[自然转换]是从一个类别到另一个类别的转换。
其实没有。从范畴到范畴的变换是函子(它把对象映射到对象,态射映射到态射)。自然变换是从函子到函子的变换(即它是函子范畴中的态射)。
Scala 中的类型类别是一个类别。它的对象是类型,它的态射是函数(不是函数类型)。
例如List
andOption
是函子。它们将对象映射到对象(类型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
}
Run Code Online (Sandbox Code Playgroud)
或在多蒂
val headOption: [A] => List[A] => Option[A] =
[A] => (as: List[A]) => as.headOption
Run Code Online (Sandbox Code Playgroud)
有不断发展的抽象序列:
https://github.com/hmemcpy/milewski-ctfp-pdf/releases/tag/v1.3.0
https://www.youtube.com/playlist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_
并非一切都可以自然转化,问题是,library doobie 的作者怎么知道,他可以从 进行自然转化
ConnectionIO ~> IO
?
实际上,如果您有一系列地图ConnectionIO[A] => IO[A]
(A
在所有类型上运行)并且该系列是使用参数多态性定义的(而不是临时多态性,即类型类,即在没有对类型附加假设的情况下定义A
)=参数性,那么自然性来自参数性“免费”。这是“免费定理”之一
https://bartoszmilewski.com/2014/09/22/parametricity-money-for-nothing-and-theorems-for-free/
https://www.reddit.com/r/haskellquestions/comments/6fkufo/free_theorems/
https://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf
归档时间: |
|
查看次数: |
665 次 |
最近记录: |