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

标签 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
}

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

最佳答案

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

  • 返回申请结果some ,如果您有 A 类型的值坐着(你是 Some )
  • 返回您的 none争论(你是 None )

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

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

编辑

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

关于scala - 如何证明两种类型的等价性以及签名是单一存在的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3622469/

相关文章:

list - Scala:过滤器在 Iterator 与 List 上的行为

scala - 计算 ExecutionContext 中的线程数

javascript - 2048 : Strange behaviour of reduceRight in map with lodash/fp

lisp - 什么类型的 lambda 演算会松散地成为 Lisp 的一个例子?

scala - 如何在 Scala 中发现装箱/拆箱

scala - 用不同的顺序对两列的Spark Dataframe进行排序

performance - 编写无限列表以跳过 p 的每个因子?

c++ - "type-switch"在 C++11 中构造

c++ - C++11 是否支持模板中的类型递归?

types - 什么是 "vocabulary types",存在多少?