我将使用精彩的https://tpolecat.github.io/doobie/库,它具有完整的功能。

我正在经历first example,并且我认识到:


ConnectionIO ~> IO是类别理论中的自然转换,但从未完全理解什么是自然转换。

但是,我知道这是从一个类别到另一个类别的转变。例如:

F[A] ~> G[A]

是从类别FG的自然转换,而不更改内容。

并非所有事物都可以自然转换,问题是,库doobie的作者如何知道他可以通过ConnectionIO ~> IO进行自然转换?

最佳答案



其实不行从一个类别到另一个类别的转换是仿函数(它将对象映射到对象,并将词素映射到词素)。自然变换是从仿函数到仿函数的变换(即,这是仿函数类别中的一种态射)。

Scala中的类型类别是category。它的对象是类型,它的morphisms是函数(不是函数类型)。

例如ListOptionfunctors。他们将对象映射到对象(类型AList[A],类型AOption[A])和态射到态射(功能f: A => B_.map(f) : List[A] => List[B]的功能,功能f: A => B_.map(f) : Option[A] => Option[B]的功能)。

例如headOptionnatural transformation(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

What is a natural transformation in haskell?

有不断发展的抽象序列:
  • 类别(及其对象和词素),
  • 态射的类别(它的对象是射态,它的射态是可交换正方形),
  • 类别类别(它的对象是类别,其态射是仿函数),
  • 仿函数的
  • 类别(它的对象是仿函数,它的态射是自然变换),
  • ...

  • https://github.com/hmemcpy/milewski-ctfp-pdf/releases/tag/v1.3.0

    https://www.youtube.com/playlist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_



    实际上,如果您有 map 族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

    Good introduction to free theorems

    关于scala - 怎么是自然的转变?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61960312/

    10-11 22:34