Я думаю, что они имеют в виду одно и то же.Согласованность ставится под сомнение только тогда, когда у вас есть несколько способов получения значения экземпляра / неявного значения;«Каждый другой действительный типизированный вывод» интересен только тогда, когда является более чем один раз типизирующим производным.И Scala, и Haskell не разрешают создавать экземпляры во время компиляции, которые могут привести к неоднозначным выводам.
Scala
В комментарии Одерского говорится о Scala: существует только один локальный способразрешающие случаи.Другими словами, существует только один действительный вывод локальной типизации.Достаточно тривиально, это согласуется с самим собой.Мне не ясно, что даже имеет смысл говорить о глобальной согласованности в Scala, но, если это так, у Scala ее точно нет:
object Object1 {
implicit val i: Int = 9
println(implicitly[Int]) // valid typing derivation of `Int` => printing 9
}
object Object2 {
implicit val i: Int = 10
println(implicitly[Int]) // valid typing derivation of `Int` => printing 10
}
Haskell
Поскольку экземпляры Haskell являются глобальными, нет смысла различать локальную / глобальную согласованность.
Во время компиляции Haskell запрещает иметь два экземпляра, в которых один заголовок экземпляра перекрывается с другим.Это превращает поиск производных типов в однозначную задачу поиска без обратной проверки.Не неоднозначность - это то, что снова дает нам согласованность.
Интересно, что GHC позволяет ослабить это требование с помощью -XIncoherentInstances
, позволяя писать локально несмежные экземпляры, что потенциально может нарушить глобальную согласованность.