Как можно доказать эквивалентность двух типов и что сигнатура обитает ли он в одиночку?

Любой, кто следил за блогом Тони Морриса и упражнениями 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
}

Кроме того, это было заявлено, что тип однократно заселен (т.е. все реализации типа в точности эквивалентны). Я могу догадаться, доказывая эквивалентность двух типов, но на самом деле не знаю, с чего начать утверждение о едином населении. Как это можно доказать?

8
задан oxbow_lakes 1 September 2010 в 22:05
поделиться

1 ответ

Тип Опция является дважды обитаемым. Он может либо содержать что-то, либо нет. Это видно из сигнатуры fold в первом трейте, в котором вы можете только:

  • вернуть результат применения some, если у вас есть значение типа A сидит без дела (ты Some)
  • верни свой аргумент none (ты None)

Any данная реализация может делать только одно или другое, не нарушая ссылочной прозрачности.

Поэтому я считаю ошибкой называть его отдельно обитаемым. Но любая реализация любой из этих черт должна быть изоморфна одному из этих двух случаев.

РЕДАКТИРОВАТЬ

Тем не менее, я не думаю, что вы действительно можете охарактеризовать «обитаемость» типа, не зная его конструкторов. Если бы вам нужно было расширить один из этих свойств option реализацией, имеющей конструктор, который, например, принимает Tuple12[A], вы могли бы написать 13 различных версий fold.

2
ответ дан 6 December 2019 в 01:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: