Требовать, чтобы полугруппа была ассоциативной в scala - PullRequest
0 голосов
/ 27 февраля 2020

Полугруппа должна быть ассоциативной, но я мог бы определить 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. Существуют ли меры предосторожности против этого, или пользователь должен полагаться на тестирование, чтобы предотвратить это?

1 Ответ

4 голосов
/ 27 февраля 2020

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

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

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