Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何证明两种类型的等价性以及签名是单独存在的?_Scala_Functional Programming_Type Theory - Fatal编程技术网

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

Scala 如何证明两种类型的等价性以及签名是单独存在的?,scala,functional-programming,type-theory,Scala,Functional Programming,Type Theory,任何关注过和scala练习的人都会知道这两种类型的签名是等效的: trait MyOption1[A] { //this is a catamorphism def fold[B](some : A => B, none : => B) : B } 以及: 此外,已经声明该类型是单独居住的(即,该类型的所有实现完全等效)。我可以猜测证明这两种类型的等价性,但我真的不知道从何处开始单一居住声明。如何证明这一点?选项类型是双重居住的。它可以包含某些内容,也可以不包含。从第一个

任何关注过和scala练习的人都会知道这两种类型的签名是等效的:

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


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

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

  • 如果您有一个类型为
    a
    的值,则返回应用
    some
    的结果(您是
    some
  • 返回
    none
    参数(您是
    none
任何给定的实现只能执行其中一种操作,而不会违反引用透明性

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

编辑
也就是说,我认为如果不知道类型的构造函数,就无法真正描述类型的“居住性”。例如,如果您要使用一个具有构造函数的实现来扩展这些选项特性之一,该构造函数采用了
Tuple12[a]
,那么您可以编写13个不同版本的
fold

cstheory.stackexchange.com可能是解决此问题的更好地方。
trait MyOption2[A] {
  def map[B](f : A => B) : MyOption2[B]
  def getOrElse[B >: A](none : => B) : B
}