Почему для любого заданного параметра типа может быть только одна реализация класса типов? - PullRequest
2 голосов
/ 31 мая 2019

Я читаю книгу FP for Mortals, в которой есть следующая строка:

Может быть только одна реализация класса типов для любого заданного параметра типа, свойство, известное как когерентность класса типов.Классы типов внешне похожи на алгебраические интерфейсы из предыдущей главы, но алгебры не обязательно должны быть связными.

Я не совсем понимаю этот параграф.Предположим, у нас есть следующий класс типов:

trait Ordering[T] {
  def compare(x: T, y: T): Int
}

Я могу создать две реализации для типа Int следующим образом:

val ord1: Ordering[Int] = new Ordering[Int] {
  def compare(x: Int, y: Int): Int =
    if (x > y) 1 else if (x == y) 0 else -1
}

val ord2: Ordering[Int] = new Ordering[Int] {
  def compare(x: Int, y: Int): Int =
    if (x > y) -1 else if (x == y) 0 else 1
}

Что авторы имеют в виду, когда говорят, что класс типов может иметь толькоодна реализация?Это не относится к экземплярам класса типов, так как мы можем иметь несколько экземпляров для одного и того же типа.Для чего это применяется?Кроме того, почему ADT не являются связными в этом смысле?

1 Ответ

3 голосов
/ 31 мая 2019

Экземпляры класса типов определяются как имплики.

implicit val ord1: Ordering[Int] = new Ordering[Int] {
  def compare(x: Int, y: Int): Int =
    if (x > y) 1 else if (x == y) 0 else -1
}

implicit val ord2: Ordering[Int] = new Ordering[Int] {
  def compare(x: Int, y: Int): Int =
    if (x > y) -1 else if (x == y) 0 else 1
}

Если вы спросите implicitly[Ordering[Int]], у вас будет

Error: ambiguous implicit values:
 both value ord1 in object App of type => App.Ordering[Int]
 and value ord2 in object App of type => App.Ordering[Int]
 match expected type App.Ordering[Int]
...