gpt4 book ai didi

Scala实现Option的选择

转载 作者:行者123 更新时间:2023-12-04 07:32:54 26 4
gpt4 key购买 nike

它是如何在 Scala 中完成的:

  sealed trait Option[+A] {
def get: A
def isEmpty: Boolean
def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
}
object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}

我如何在面向对象世界中假设它:
  sealed trait Option[+A] {
def map[B](f: A => B): Option[B]
}
object None extends Option[Nothing] {
def map[B](f: Nothing => B): Option[B] = this
}
case class Some[+A](get: A) extends Option[A] {
def map[B](f: A => B): Option[B] = Some(f(get))
}

后者有什么问题?

Functional programming in Scala正在使用 matchOption[A] trait,这是第三种方式(看起来像 Haskell,但为什么?)为什么不利用子类型多态性?

更新 :我提到的第三种方式:
sealed trait Option[+A] {
def map[B](f: A => B): Option[B] = this match {
case None => None
case Some(a) => Some(f(a))
}
}
object None extends Option[Nothing] {
}
case class Some[+A](get: A) extends Option[A] {
}

最佳答案

我不确定您是否打算这样做,但是您遗漏了 isEmpty 的声明和 get ,任何想要检查任意内容的人都需要这些 Option无需降级到 Some .由于这两种方法都需要由两个子类定义,并且由于 map可以用它们来定义,我认为原因是最好定义 map在一个地方利用其他方法的子类实现,而不是定义 map在三个地方。

关于Scala实现Option的选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982010/

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