Я думаю, что они имеют в виду одно и то же. Согласованность ставится под сомнение только тогда, когда у вас есть несколько способов получения значения экземпляра / неявного значения; «каждый другой действительный типизированный производный» интересен только тогда, когда является более чем один раз типизирующим производным. И Scala, и Haskell не разрешают создавать экземпляры во время компиляции, что может привести к неоднозначным выводам.
Комментарий Одерского гласит это для 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 являются глобальными, нет смысла различать локальную / глобальную согласованность.
Хаскелл запрещает во время компиляции иметь два экземпляра, где один из них совпадает с другим. Это превращает поиск производных типов в однозначную задачу поиска без обратной проверки. Не двусмысленность - это то, что дает нам согласованность.
Интересно, что GHC позволяет вам ослабить это требование с помощью -XIncoherentInstances
, позволяющего записывать локально не смежные экземпляры, что также может нарушить глобальную согласованность.
Да, вы бы использовали mod_cache (возможно, с mod_disk_cache ).