我将使用精彩的https://tpolecat.github.io/doobie/库,它具有完整的功能。
我正在经历first example,并且我认识到:
ConnectionIO ~> IO
是类别理论中的自然转换,但从未完全理解什么是自然转换。
但是,我知道这是从一个类别到另一个类别的转变。例如:
F[A] ~> G[A]
是从类别
F
到G
的自然转换,而不更改内容。并非所有事物都可以自然转换,问题是,库doobie的作者如何知道他可以通过
ConnectionIO ~> IO
进行自然转换? 最佳答案
其实不行从一个类别到另一个类别的转换是仿函数(它将对象映射到对象,并将词素映射到词素)。自然变换是从仿函数到仿函数的变换(即,这是仿函数类别中的一种态射)。
Scala中的类型类别是category。它的对象是类型,它的morphisms是函数(不是函数类型)。
例如List
和Option
是functors。他们将对象映射到对象(类型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
是natural 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/