【发布时间】:2017-05-22 02:56:21
【问题描述】:
如果Hask是所有haskell类型的范畴(以函数为箭头),那么我们能不能想到ob(Hask)(即Hask的对象集合>) 等于*?
如果不是,这在什么意义上是错误的?
【问题讨论】:
如果Hask是所有haskell类型的范畴(以函数为箭头),那么我们能不能想到ob(Hask)(即Hask的对象集合>) 等于*?
如果不是,这在什么意义上是错误的?
【问题讨论】:
在这一点上,每次提出有关 Hask 的问题时链接到 Hask article on the Haskell wiki 肯定是某种陈词滥调,但就是这样。
稍微扩展一下 wiki,我认为这个问题的答案很无聊,是的,但这只是因为 Hask 是 定义 的,因此 Hask 的对象是一种类型 ⭑。完整的定义是:
让每一种类型 ⭑ 都成为 Hask 的对象,undefined 除外。我认为“是”基本上是您问题的答案,直到魔鬼的拥护者提出undefined 和seq,此时答案必然变得越来越复杂。
让A -> B类型的每个函数都是从A类型对应的对象到B类型对应的对象的箭头。
非常小心choose a notion of equality for the arrows, which may or may not exist (see ensuing discussion) 或者扔掉seq 或者干脆放弃。
让id :: A -> A对应的箭头为每个对象的标识箭头。
让.,是关联的&c.,对应箭头的组成,必须是关联的&c.
这绝不是您可以用来为 Haskell 程序建模的唯一类别,但我们这样做并以 Hask 名称祝福它,因为许多其他概念自然对应于 Haskell 计算。例如,该类别的内函子可以方便地表示为 ⭑ -> ⭑ 具有(合法的)函数采用 fmap :: ((a :: ⭑) -> (b :: ⭑)) -> ((f a :: ⭑) -> (f b :: ⭑))。
【讨论】:
是的,但在 Haskell 中,除了 * 之外还有其他类型的类型,DataKinds 不属于您的 Hask 类别。
{-# LANGUAGE DataKinds #-}
data Foo = Bar
'Bar 的种类是Foo,所以你不能和它一起使用->,所以它会在你的 Hask 之外,但仍然是 Haskell 类型。
【讨论】: