怎么是自然的转变?

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)

是从类别FG不改变内容的自然转变。

并非一切都可以自然转化,问题是,library doobie 的作者怎么知道,他可以从 进行自然转化ConnectionIO ~> IO

Dmy*_*tin 7

我知道[自然转换]是从一个类别到另一个类别的转换。

其实没有。从范畴到范畴的变换是函子(它把对象映射到对象,态射映射到态射)。自然变换是从函子到函子的变换(即它是函子范畴中的态射)。

Scala 中的类型类别是一个类别。它的对象是类型,它的态射是函数(不是函数类型)。

例如ListandOption函子。它们将对象映射到对象(类型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)

Haskell 中的自然转换是什么?

有不断发展的抽象序列:

  • 范畴(及其对象和态射),
  • 态射的范畴(它的对象是态射,它的态射是可交换的平方),
  • 范畴的范畴(它的对象是范畴,它的态射是函子),
  • 函子的范畴(它的对象是函子,它的态射是自然变换),
  • ...

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

自由定理的好介绍