gpt4 book ai didi

language-agnostic - 函数式语言之外的代数数据类型?

转载 作者:行者123 更新时间:2023-12-03 15:12:49 25 4
gpt4 key购买 nike

哪些语言不仅仅是函数式的,还有代数数据
类型(或类似的东西)和模式匹配?我也对多范式语言感兴趣 - 我知道 Ocaml 和 F# 是添加了 OO 的 ML 方言,因此它们继承了 ML 的代数数据类型。

可以使用 enum 模拟它们。 s 和 union s(如在 C、C++ 中,...更多?),但是这很快就会变得笨重和丑陋,如果您忘记了模式匹配中的大小写或(更可能的,更危险的),编译器将无法警告您) 当“以错误的方式”访问联合时,即您要求一个 Left 的字段当它实际上是 Right 时的值值(然后你得到的是对碰巧在那里的位的无意义的重新解释)。

我听说Pascal has something like tagged unionsCyclone language也支持带标签的工会。维基百科还提到了 Ada 和 Algol。还有其他语言吗?

(如果您从未听说过代数数据类型,您可以阅读 an Answer to "What is 'Pattern Matching' in functional languages?" 以获得出色的介绍)。

最佳答案

在 Scala 中,你通常会使用 case class es 来模拟真蓝函数式语言(如 ML 和 Haskell)中的代数数据类型。

例如,以下 F# 代码(取自 here):

type Shape =
| Circle of float
| EquilateralTriangle of double
| Square of double
| Rectangle of double * double

let area myShape =
match myShape with
| Circle radius -> Math.PI * radius * radius
| EquilateralTriangle s -> (sqrt 3.0) / 4.0 * s * s
| Square s -> s * s
| Rectangle (h, w) -> h * w

大致可以翻译成Scala如下:
sealed abstract class Shape
case class Circle(radius: Float) extends Shape
case class EquilateralTriangle(side: Double) extends Shape
case class Square(side: Double) extends Shape
case class Rectangle(height: Double, width: Double) extends Shape

def area(myShape: Shape) = myShape match {
case Circle(radius) => math.Pi * radius * radius
case EquilateralTriangle(s) => math.sqrt(3.0) / 4.0 * s * s
case Square(s) => s * s
case Rectangle(h, w) => h * w
}
sealed上面的关键字用于让编译器警告您,以防您忘记任何 casematch表达。

关于language-agnostic - 函数式语言之外的代数数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3963026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com