Как скаляр может сделать «A \ / B», и как я могу сделать свой собственный «B. ??» или "А B» - PullRequest
0 голосов
/ 01 мая 2020

Я относительно новичок в scala последствиях, но если бы я хотел быть в состоянии сделать 5.??, я бы сделал:

class MyInt(int: Int) {
  // Useless, just to make a point
  def ?? : Int = int * 100
}

implicit def toMyInt(int: Int): MyInt =
  MyInt(int)

Мой вопрос таков: как скаляр может делать A \/ B, и как я могу сделать то же самое, что и выше, добавив свои собственные операторы (но для работы с типами)?
Немного контекста о том, что я пытаюсь поиграть и сделать:

abstract class Err(val message: String) { /* ... */ }

sealed trait MaybeErr[+E <: Err, +T] { /* ... */ }

Ближайшее, что я смог получить:

type ??[+T] = MaybeErr[Err, T]

type <??>[+E <: Err, +T] = MaybeErr[E, T]

def div1(t: Int, b: Int): ??[Int] = /* ... */

def div2(t: Int, b: Int): <??>[OtherErr, Int] = /* ... */

Что я хочу сделать:

// T.?? = MaybeErr[Err, T]

// E <??> T = MaybeErr[E, T]

def div1(t: Int, b: Int): Int.?? = /* ... */

def div2(t: Int, b: Int): OtherErr <??> Int = /* ... */

1 Ответ

0 голосов
/ 01 мая 2020

Как скаляр может сделать A \/ B, и как я могу сделать то же самое, что и выше

Любой конструктор двоичного типа C[A, B] может быть альтернативно записан в инфиксной форме A C B (или C:[A, B] как B C: A для конструкторов типов, заканчивающихся двоеточием :), см. section 3.10 Типы инфиксов языка Scala 2.13 Спецификация .

Вы можете увидеть определение \/ в core/src/main/scala/scalaz/Either.scala:

sealed abstract class \/[A, B] extends Product with Serializable
...