首页 > 解决方案 > 使用 ClassTag 时“缺少实现”

问题描述

我正在尝试实现以下特征:

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

对于类型数组:

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 没有 ClassTag。如果我添加它们(使用隐式参数或“[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] = ???

我可能缺少一些明显的东西,但我不确定它是什么。

标签: scala

解决方案


如果您添加它们,那么您将更改签名并且不再覆盖原始方法(添加override并且您将看到“overrides nothing”错误)。

您根本无法Monad[Array]实现Monad.


推荐阅读