代码之家  ›  专栏  ›  技术社区  ›  Evgeny

除了求和和和积之外还有代数数据类型吗?

  •  0
  • Evgeny  · 技术社区  · 5 年前

    根据大多数定义,Haskell或Scala中常见的或基本的代数数据类型是和和和积。示例: 1 2 .

    有时一个定义只是说 algebraic data types are sum and product 或许是为了简单起见。

    如果在基本代数中有减法、除法、提升到整数幂运算,那么在程序设计中其他代数类型的一些实现是可能的,但它们是没有用的吗?

    有没有编程语言实现的代数数据类型不是求和和和乘积类型?

    0 回复  |  直到 5 年前
        1
  •  14
  •   luqui    5 年前

    “代数”来源于范畴理论。每种代数数据类型都是 initial algebra

    把“代数”解释成“高中代数”(我不是要居高临下,那只是 how we refer to it )如你所知,有一些很好的类比。

    • A -> B 类似于 B A . 在范畴理论中,当你把一个函数(“态射”)看作一个范畴的对象时,它被称为 ,使用后一种符号。为了好玩,看看你能不能证明法律 C A+B = C A × C B
    • 除法类似于
    • 以这样的速度,你会期望减法有一些漂亮的类比,但唉,我不知道。丹·皮波尼对此进行了一些探索 the antidiagonal ,但这远非一般的类比。
        2
  •  3
  •   Will Ness Derri Leahy    5 年前

    那么一个非传统的答案是 indexed families this one . Childs的方法在关于关系(数据库)模型的开创性论文中得到了提及 Codd 1970 .

    关键特性是,可以使用任何类型为组件集合编制索引;组件是异构的;编译器支持按组件和整个结构进行类型安全访问(读取和更新)。组件很可能在结构中按位置组织,但这是对程序员隐藏的实现细节。(哈斯克尔的记录系统在这一点上失败了。)

    有没有编程语言实现的代数数据类型不是求和和和乘积类型?

    您可能接受也可能不接受SQL是一种编程语言。我可能不接受SQL“列名”是“索引族”的实现。SQL的列和行太多地面向物理布局(事实上,大多数供应商的SQL仍然允许对列使用位置表示法,尽管该标准已经弃用了位置表示法)。也就是说,SQL是最接近的。

    有一些可扩展/匿名的记录系统是用Haskell(特别是HList)或Haskell类似的语言(比如Ur/web)提出/开发的,甚至还有亲爱的Hugs' TRex . (见 the Gaster & Jones paper 对于FP语言中其他尝试的链接),它们都是有限的,因为他们试图在Haskell的产品类型和上加上唇膏。