Scala: класс значений против класса дел

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

class IntegerMod5(val value: Int) extends AnyVal
case class IntegerMod5(value: Int)

Несмотря на это, кажется, что я могу создать реализацию Numeric довольно легко. С подходом класса случая я могу просто сделать это:

case class IntegerMod5(value: Int)(implicit ev: Numeric[IntegerMod5]) {
    import ev.mkNumericOps
}

Тем не менее, кажется, что гораздо сложнее работать с классами значений, в основном потому, что выгода в том, чтобы избежать создания объекта. Таким образом, что-то вроде

implicit class IntegersMod5Ops(value: IntegerMod5)(implicit ev: Numeric[IntegerMod5]) {
    import ev.mkNumericOps
}

Казалось бы, в значительной степени победить цель. (Не уверен, если это вообще работает, на самом деле.)

Вопрос в том, можно ли использовать Numeric с классом значений, или мне придется кусать пули и использовать класс case?

1 ответ

Вам не нужно implicit ev: Numeric[IntegerMod5] в качестве аргумента просто определите его в сопутствующем объекте:

object IntegerMod5 {
  implicit val numeric: Numeric[IntegerMod5] = ...
}

Он будет автоматически выбран при использовании арифметических операций над IntegerMod5с, и потому что это val, он инициализируется только один раз (вы можете использовать object также).

Другие вопросы по тегам