«Отсутствующие реализации» при использовании ClassTag - PullRequest
1 голос
/ 29 марта 2020

Я пытаюсь реализовать следующую черту:

trait Monad[M[_]] {
  def pure[A](a: A): M[A]
  def flatMap[A, B](ma: M[A], f: A => M[B]): M[B]
}

для типа Array:

def arrayMonad: Monad[Array] = new Monad[Array] {
  def pure[A](a: A): Array[A] = Array(a)
  def flatMap[A, B](a: Array[A], f: A => Array[B]): Array[B] = a flatMap f
}

Компилятор жалуется, что для A и B. нет ClassTags. Если я добавьте их (либо с неявным параметром, либо в стиле «[A: ClassTag]»), мне сказали, что мне не хватает реализации:

Missing implementations for 2 members. Stub implementations follow:
  def flatMap[A, B](ma: Array[A], f: A => Array[B]): Array[B] = ???
  def pure[A](a: A): Array[A] = ???

Может быть что-то очевидное, что я пропускаю, но Я не уверен, что это такое.

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Если вы добавите их, вы измените подпись и больше не будете переопределять оригинальные методы (добавьте override, и вы увидите ошибку «ничего не переопределяет»).

Вы просто не можете реализовать Monad[Array] для этого определения Monad.

1 голос
/ 29 марта 2020

Возможно, подражать вкладу Луиса в кошек Добавление экземпляров для ArraySeq # 3273 и использование фабрики untagged, чтобы избежать необходимости неявного ClassTag:

def arrayMonad: Monad[ArraySeq] = new Monad[ArraySeq] {
  def pure[A](a: A): ArraySeq[A] = ArraySeq.untagged(a)
  def flatMap[A, B](a: ArraySeq[A], f: A => ArraySeq[B]): ArraySeq[B] = a flatMap f
}

arrayMonad.pure(42)
// res0: scala.collection.immutable.ArraySeq[Int] = ArraySeq(42)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...