如何对它进行自然改造呢?

问题描述 投票:0回答:1

我将使用精彩的图书馆 https:/tpolecat.github.iodoobie。 而且功能齐全。

我正在通过 首例 和我已经认识到了。

Transactor是一种数据类型,它知道如何连接到数据库,如何发出连接,如何清理它们;有了这些知识,它就可以转化为: ConnectionIO ~> IO,这就给了我们一个可以运行的程序。

ConnectionIO ~> IO 是范畴理论中的自然转换,但一直没有完全理解,自然转换到底是什么。

但是,我知道它是从一个类别转化到另一个类别。例如

F[A] ~> G[A]

是一个自然转换,从一个类别 FG 而不改变内容。

并不是所有的东西都可以自然转化,问题是,图书馆的作者dobie怎么知道,他可以做到从自然转化为 ConnectionIO ~> IO?

scala haskell functional-programming category-theory
1个回答
7
投票

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

其实不是。从类别到类别的转换是漏子(它把对象映射到对象,把形态映射到形态)。自然转换是由漏子到漏子的转换(即它是漏子类别中的变形)。

Scala中的类型类别是一个 种类. 它的对象是类型,它的 词形 是函数(不是函数类型)。

例如 ListOption向量. 它们将对象映射到对象上(类型 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

什么是hashkell中的自然转换?

有一个不断发展的抽象序列。

  • 类别(及其对象和形态),
  • 形态的范畴(它的对象是形态,它的形态是换位平方)。
  • 类的范畴(它的对象是范畴,它的形态是漏子)。
  • 漏斗类(它的对象是漏斗,它的形态是自然变换)。
  • ...

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

https:/ttic.uchicago.edu~dreyercoursepaperswadler.pdf。

很好的自由定理介绍

© www.soinside.com 2019 - 2024. All rights reserved.