如何证明两种类型的等价性以及签名是单独居住的?

时间:2010-09-01 22:05:54

标签: scala functional-programming type-theory

任何一直关注Tony Morris' blog和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
}

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

1 个答案:

答案 0 :(得分:2)

Option类型是双重居住的。它可以包含或不包含。从第一个特征fold的签名中可以清楚地看出,你只能在其中:

  • 返回应用some的结果,如果您有A类型的值(您是Some
  • 返回您的none参数(您是None

任何给定的实现只能执行其中一种,而不会违反参照透明度。

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

修改

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