当前位置: 首页 > 知识库问答 >
问题:

为采用带有类型参数的方法的typeclass定义构造函数?

邹玄裳
2023-03-14
abstract class IsTC[A[_], T] {
  // type S is an abstract type rather than type parameter, but must implement Valid[A]
  type S
  implicit val sIsValid: Valid[S]

  def get(self: A[T], i: Int): T
  def changeType[_T]: A[_T]
}
object IsTC {
  def apply[A[_], T, _S](
    fget: (A[T], Int) => T,
    fchangeType:  // what should this type annotation be?
  ): IsTC[A, T] { type S = _S } = new IsTC[A, T] {
    type S = _S
    def get(self: A[T], i: Int) = fget(self, i)
    def changeType[_T]: A[_T] = fchangeType[_T]
  }
}

共有1个答案

东郭元魁
2023-03-14

Scala2不支持多态函数。多态性可以是方法,而不是值。和函数都是值。多态函数可以用包装器进行仿真

// for [A] => (a: A) => B[A]
trait Poly {
  def apply[A](a: A): B[A]
}

// for [A <: U] => (a: A) => B[A]
trait Poly[U] {
  def apply[A <: U](a: A): B[A]
}

比如shapeless.poly。它们推广了普通函数

trait Function[A, B] {
  def apply(a: A): B
}
object IsTC {
  def apply[A[_], T, _S](
                          fget: (A[T], Int) => T,
                          fchangeType: FchangeType[A]
                        ): IsTC[A, T] { type S = _S } = new IsTC[A, T] {
    override type S = _S
    override implicit val sIsValid: Valid[_S] = ???
    override def get(self: A[T], i: Int) = fget(self, i)
    override def changeType[_T]: A[_T] = fchangeType[_T]
  }
}

trait FchangeType[A[_]] {
  def apply[X]: A[X]
}
 类似资料:
  • 首先,这更像是一个理智检查问题,以获得比我更精通语言标准深度的人的认可。 假设我有以下类型(尽管我忽略了任何非构造函数和非赋值成员函数): 好吧,在任何合理的实现中,在内存中都不应该是普通的。但我对标准的保证很感兴趣。以下是我根据C 98/03定义POD的理由: 不能是 POD 类型,因为它具有非公共字段、基类和用户定义的构造函数。 和C 11的losened/扩展定义: > 它应该是微不足道的可

  • 我试图构建一个包含getter和setter的构造函数,除了在参数中调用它之外,这些构造函数似乎对我的所有属性都很好。 当我读到这行代码时: 然后在控制台中出现以下错误: 构造函数flip(String)未定义构造函数flip(String)未定义 也许我错过了什么?

  • 在此处输入图像描述 在此处输入图像描述 我仍然不知道该怎么办(我在UserRepository上尝试了Repository注释-错误是一样的)。错误消息:`启动ApplicationContext时出错。要显示条件报告,请在启用“调试”的情况下重新运行应用程序。2022-03-14 09:04:54.626错误7236---[main]o.s.b.d.LoggingFailureAnalysisR

  • Kotlin中的参数与Java中有些不同。如你所见,我们先写参数的名字再写它的类型: fun add(x: Int, y: Int) : Int { return x + y } 我们可以给参数指定一个默认值使得它们变得可选,这是非常有帮助的。这里有一个例子,在Activity中创建了一个函数用来toast一段信息: fun toast(message: String, length: I

  • 问题内容: 如果父类中有带参数的构造函数,为什么需要默认构造函数(显式) 这将是一个错误。 问题答案: 这里有两个方面的工作: 如果 确实 明确指定了构造函数(如中所述),则Java编译器将 不会 为您创建无参数构造函数。 如果您未明确指定构造函数(如所示),则Java编译器将为您创建一个无参数的构造函数,如下所示: (可访问性取决于类本身的可访问性。) 试图调用超类无参数构造函数-因此它必须存在

  • 问题内容: 我想编写一个在构造函数中获取“前缀”参数的TypeScript类,该类还需要访问LogService注入。 使用纯JavaScript,您应该这样做: 因此,当您将此工厂注入控制器时,可以像这样多次启动它(无需注入LogService): 您将如何在TypeScript类中定义此Factory?无法在函数内部定义TypeScript类。此类应有权访问LogService,但不能通过注入