Требовать, чтобы полугруппа была ассоциативной в scala

Полугруппа должна быть ассоциативной, но я мог бы определить Semigroup как:

trait Semigroup[T] {
  def op(t1:T, t2:T) : T
}

def plus = new Semigroup[Int] { def op(t1:Int, t2:Int) = t1 - t2 }

Я могу реализовать plus, который не является ассоциативным, но класс по-прежнему остается Semigroup. Предусмотрена ли защита от этого или ожидается, что пользователь будет полагаться на тестирование, чтобы предотвратить это?


person Rob    schedule 27.02.2020    source источник
comment
Нет, это выходит за рамки того, что может доказать система типов. Однако вы можете использовать тестирование на основе свойств, чтобы убедиться, что все экземпляры верны.   -  person Luis Miguel Mejía Suárez    schedule 27.02.2020
comment
Монтриво недавно продемонстрировал проверку закона stackoverflow.com/a/60405778/5205022 (хотя в этом ответе я не уверен, что ассоциативность должна быть прохождение)   -  person Mario Galic    schedule 27.02.2020


Ответы (1)


Не будет исключения компиляции, для которого свойство ассоциативности не выполняется. Другими словами, вы должны убедиться, что он реализован правильно.

Но если вы используете кошек, вы можете использовать законы, чтобы убедиться, что все свойства, необходимые для полугруппы и других структур, определены в кошках. Ознакомьтесь с документацией. Вы можете создать тест, чтобы проверить, в порядке ли определенная вами полугруппа:

class TreeLawTests extends AnyFunSuite with Discipline {
  checkAll("YourSemigroup[YourType].SemigroupLaws", SemigroupTests[YourSemigroup[YourType]].semigroup)
}
person Andronicus    schedule 27.02.2020