gpt4 book ai didi

scala - 在 Scala 中定义 ADT 的最佳方式是什么 - OO vs FP

转载 作者:行者123 更新时间:2023-12-02 16:44:59 26 4
gpt4 key购买 nike

经过一番讨论后,我想强调,这个问题与在 OOP 中使用继承而不是在 FP 中使用 Product/Sum 类型有关,反之亦然。您更喜欢什么以及您的建议是什么!所以...

我有一些疑问 - 定义以下内容的更清晰(更清晰)的方法是什么:

例如我更喜欢

sealed trait Shape

case class Square(length: Int) extends Shape
case class Rhombus(length: Int) extends Shape

而不是

sealed abstract class Shape(val length: Int)

case class Square(override val length: Int) extends Shape(length)
case class Rhombus(override val length: Int) extends Shape(length)

但是然后

def draw(shape: Shape): String = shape match {
case Square(length) => length.toString
case Rhombus(length) => length.toString
}

而不是

def draw(shape: Shape): String = shape.length.toString

第一种方法中类型的定义看起来不那么冗长且更加一致,但如果我需要为所有形状提供通用逻辑,例如 draw 方法,第二种方法看起来更清晰。

最佳答案

这将是首选方式:

sealed trait Shape {
def length: Int
}

case class Square(length: Int) extends Shape
case class Rhombus(length: Int) extends Shape

以下是代码中一些不惯用的内容:

  • 抽象类主要是java兼容性的东西,尽可能使用特征
  • 覆盖未实现的字段感觉不对
  • 接口(interface)中的
  • val应该避免,总是使用defs作为抽象,这些可以用其他东西来完善

关于scala - 在 Scala 中定义 ADT 的最佳方式是什么 - OO vs FP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43891348/

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