Любой, кто следил за блогом Тони Морриса и упражнениями 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
}
Кроме того, это было заявлено, что тип однократно заселен (т.е. все реализации типа в точности эквивалентны). Я могу догадаться, доказывая эквивалентность двух типов, но на самом деле не знаю, с чего начать утверждение о едином населении. Как это можно доказать?
Тип Опция
является дважды обитаемым. Он может либо содержать что-то, либо нет. Это видно из сигнатуры fold
в первом трейте, в котором вы можете только:
some
, если у вас есть значение типа A
сидит без дела (ты Some
) none
(ты None
) Any данная реализация может делать только одно или другое, не нарушая ссылочной прозрачности.
Поэтому я считаю ошибкой называть его отдельно обитаемым. Но любая реализация любой из этих черт должна быть изоморфна одному из этих двух случаев.
Тем не менее, я не думаю, что вы действительно можете охарактеризовать «обитаемость» типа, не зная его конструкторов. Если бы вам нужно было расширить один из этих свойств option реализацией, имеющей конструктор, который, например, принимает Tuple12[A]
, вы могли бы написать 13 различных версий fold
.