当前位置: 首页 > 知识库问答 >
问题:

Haskell中的所有类型类都有范畴理论上的类比吗?

许照
2023-03-14

现在考虑一个成员类型为*的typeclass。例如,可以想象一个类型类group,它对应于组的类别(从技术上讲,groupHask的子类别,其对象包含Haskell的所有类型)。概括:

问题2:Haskell中每个成员类型为*的typeclass是否都对应于某个类别(从技术上讲:Hask的某个子类别)?

由此可以提出下一个一般性问题:

一般问题:每一个Haskell类型类是否都对应于某种范畴理论的概念?

Edit:至少,您可以说,由于每个类型类都包含一些Haskell类型集作为其成员,您可以将每个类型类视为hask的某个子类别(在.下关闭,并使用ID)。

共有1个答案

蒋权
2023-03-14

当解释得足够迂腐时,所有这些问题的答案都是“是”,但出于毫无信息的琐碎原因。

每一个类别C都限制为一个离散的子类别C,它具有与C相同的对象,但只有同态性(因此没有有趣的结构)。至少,对Haskell类型的操作可以令人厌烦地解释为对离散类别*的操作。最近的“角色”故事相当于(但不是旋转为)试图承认态性重要,而不仅仅是对象。类型的“名义”角色相当于在*中工作,而不是在*中工作。

(注意,我不喜欢使用“hask”作为“Haskell类型和函数类别”的名称:我担心将一个类别标记为Haskell类别会产生不幸的副作用,使我们看不到Haskell编程中其他类别结构的丰富。这是一个陷阱。)

对于问题3,因为到处都潜伏着大量的范畴结构,所以肯定有大量的范畴结构(可能,但不一定)存在于更高级的范畴中。我特别喜欢索引集合族之间的函数。

type (s :: k -> *) :-> (t :: k -> *) = forall x. s x -> t x

class FunctorIx (f :: (i -> *) -> (j -> *)) where
  mapIx :: (s :-> t) -> (f s :-> f t)

ij重合时,询问这样的f是否是单子就变得明智了。通常的分类定义就足够了,尽管我们已经留下了*->*

信息是这样的:没有任何关于作为一个类型化的东西内在地诱导有趣的范畴结构;有很多有趣的范畴结构可以通过各种类型的类型类有效地表示出来。从*(集合和函数)到*->*(函数和自然转换),肯定有有趣的函数。不要因为漫不经心地谈论“哈斯克”而蒙蔽了哈斯克尔范畴结构的丰富性。

 类似资料:
  • 在Haskell中有Hask,其中的对象是Haskell类型,而态性是Haskell函数。但是,type类有一个函数,它在这些类型(因此是对象而不是类别本身)之间进行映射: 和都是HASK中的对象。这是否意味着Haskell中的每个实例都是一个内函数,如果不是,真的表示一个函数吗?

  • 我知道Haskell中的许多名字都是受到范畴理论术语的启发,我正试图准确地理解类比的起点和终点。 我已经知道由于一些关于严格/懒惰和的技术细节,不(一定)是一个类别,但现在让我们先把那个放在一边。为了清楚起见, 的对象是具体类型,即kind的类型。这包括像这样的函数类型,但不包括像这样需要类型参数的函数类型。但是,具体类型属于。类型构造函数/多态函数更像是自然转换(或从到自身的其他更一般的映射),

  • 从范畴理论的角度来看,这个答案包括以下陈述: ...事实是co和逆变函子之间没有真正的区别,因为每个函子都是协变函子。 更详细地说,从C类到D类的逆变函子F无非是F型的(协变)函子:COP→D,从C的相反类到D类。 另一方面,Haskell的和仅要求分别为实例定义和。这表明,从Haskell的角度来看,存在但不是的对象(反之亦然)。 因此,在范畴理论中,似乎“co和逆变函子之间没有真正的区别”,而

  • Haskell是一种函数语言,它是严格类型化的,Haskell编译器在编译时知道整个应用程序中使用的数据类型。 1. 内置类型类 在Haskell中,每个语句都被视为数学表达式,并且此表达式的类别称为类型()。可以说是在编译时使用的表达式的数据类型。 要了解有关类型的更多信息,可以使用命令。以通用的方式可以将类型视为值,而可以将类型类视为一组相似类型的类型。在本章中,我们将学习不同的内置类型。 2

  • 问题内容: 我是C ++ / Java程序员,在日常编程中碰巧使用的主要范例是OOP。在某个线程中,我读到一条评论,即Type类本质上比OOP更直观。有人可以用简单的词来解释类型类的概念,以便像我这样的OOP家伙可以理解吗? 问题答案: 首先,我总是非常怀疑这种程序结构更直观。编程是违反直觉的,并且总是会因为人们自然而然地根据特定情况而不是一般规则来思考。要更改此设置,需要培训和实践,也称为“编程

  • 问题内容: 我想比较Java中的类类型。 我以为我可以这样做: 我想比较一下是否传递给函数的obj是从MyObject_1扩展而来的。但这是行不通的。似乎getClass()方法和.class提供了不同类型的信息。 如何比较两个类类型,而不必创建另一个伪对象来比较类类型? 问题答案: 试试这个: 由于继承,这对接口也有效: 有关instanceof的更多信息,请访问:http : //mindpr