任何关注托尼·莫里斯的博客和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
}此外,还指出该类型是单独居住的(即该类型的所有实现都是完全等价的)。我可以猜测这两种类型的等价性,但实际上不知道从何处开始使用单一居住语句。如何证明这一点?
发布于 2010-09-01 23:30:34
Option类型是双重居住的。它可以包含什么东西,也可以不包含。从fold在第一个特征中的签名可以清楚地看出这一点,在第一个特征中,您只能:
some的结果,如果您的值为A类型(您是一个Some)none参数(您是None)任何给定的实现只能执行一种或另一种,而不违反引用透明度。
所以我认为把它叫做单人区是个错误。但这两种特征的任何实现都必须与这两种情况中的一种同构。
编辑
尽管如此,我认为你不能在不知道它的构造函数的情况下真正描述一种类型的“居住性”。例如,如果要使用使用Tuple12[A]的构造函数的实现来扩展这些选项特性之一,则可以编写13个不同版本的fold。
https://stackoverflow.com/questions/3622469
复制相似问题