8

任何一直关注Tony Morris 的博客和 scala 练习的人都会知道这两种类型签名是等价的:

trait MyOption1[A] {
  //this is a catamorphism
  def fold[B](some : A => B, none : => B) : B 
}

和:

trait MyOption2[A] {
  def map[B](f : A => B) : MyOption2[B]
  def getOrElse[B >: A](none : => B) : B
}

此外,已经声明该类型是单独存在的(即该类型的所有实现都是完全等价的)。我可以猜测证明这两种类型的等价性,但真的不知道从哪里开始单居声明。如何证明这一点?

4

1 回答 1

2

Option类型是双重居住的。它可以包含或不包含某些内容。从第一个特征的签名中可以清楚地看出这一点fold,您只能:

  • some如果你有一个类型的值,则返回应用的结果A(你是一个Some
  • 返回你的none论点(你是一个None

任何给定的实现只能做一个或另一个,而不会违反引用透明度。

所以我认为称它为单人居住是错误的。但是这些特征中的任何一个的任何实现都必须与这两种情况之一同构。

编辑

也就是说,我不认为你可以在不知道它的构造函数的情况下真正描述一个类型的“居住性”。例如,如果您要使用具有构造函数的实现来扩展这些选项特征之一Tuple12[A],例如,您可以编写 13 个不同版本的fold.

于 2010-09-01T23:30:34.673 回答