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

克里斯珀

我遇到的一种情况是,我所知道的所有解决方案都不像是好的解决方案。我试图定义一个类型类,如下面的示例,其中它具有S必须实现另一个类型类(未显示)的抽象类型Valid[A]感觉最简单的方法是创建一个apply构造函数,该构造函数将强制用户输入S并自动引入的隐式实例sIsValid

问题在于该函数changeType采用类型参数。尽管进行了一些谷歌搜索,但我还没有弄清楚如何为带有类型参数的函数编写类型注释(这可能是因为Scala不允许使用带有类型参数的匿名函数)。我的方法在这里看来是明智的吗?如果我可以提供类型注释,changeType则类型类用户仍可以将非匿名函数传递给apply构造函数,这似乎是最令人满意的解决方案。

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]
  }
}

感激收到任何帮助/想法。

米米(Dmytro Mitin)

Scala 2不支持多态功能。多态可以是方法,而不是值。功能就是价值。可以使用包装器模拟多态函数

// 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]
}

Dotty具有[A <: U] => (a: A) => f[A](a)态函数类型的多态函数,[A <: U] => A => B[A]但是即使在那里implementation restriction: polymorphic function types must have a value parameter,您也不能拥有多态函数类型[X] => A[X]不要与lambda类型混淆[X] =>> A[X])。

此外(除了使用包装程序进行仿真外),某些多态类型也可以通过存在性类型表示:([A] => B[A] => C对于C)实际上是B[_] => C

这是因为∀a: (B(a) => C)(∃a: B(a)) => C

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

构造函数结果类型不是带有类型参数的类上的<:<类类型

使用带有类型参数的工厂方法,使用参数化的构造函数创建派生类

将带有可选模板类型参数的函数传递给类构造函数,并将其分配给方法

在C ++中的模板实例化中将带有构造函数的类用作类型参数

给定类型,定义带有参数类型键的函数联合

如何扩展其构造函数具有类型为“Title”的参数的类-@angular/platform-browser 类型参数

没有为类型dbcontext定义无参数构造函数

没有为'System.Collections.Generic.IList`1的类型定义无参数构造函数

带有简单类型的Spring构造函数参数歧义

HttpClientFactory:带有其他构造函数参数的HttpClient类型

获取函数/类构造函数的参数类型

在具有类型参数的函数中调用的类型类方法

“AudioClip”不采用带有 0 个参数的构造函数

带有静态方法的Typescript通用类构造函数参数

具有变量标签的C#JSON-没有为'System.String'类型定义无参数构造函数

为带有多个参数的函数创建SWIG类型图的更简单方法?

如何使模板化类专用于采用不带参数的方法函数类型?

如何采用任何构造函数类型并将其转换为接受相同参数的函数类型?

带有构造函数参数的模板类

修复了反序列化期间没有为“ System.String []”类型定义的无参数构造函数的问题

错误System.MissingMethodException:没有为'System.Linq.Expressions.Expression`1的类型定义无参数构造函数

将存储库注入 SiteResourceGraphType 时,“没有为类型 SiteResourceGraphType 定义无参数构造函数”消息

在静态方法中实例化非静态类(上下文),构造函数以对象类型为参数

Matlab错误:“类型为'double'的输入参数的未定义函数或方法X”具有递归

无法为具有模板类型参数的模板类型创建构造函数

具有类型参数的派生构造函数

为“精炼”类型获取正确的类型构造函数参数

为什么在通用类中不能有采用不同通用类型参数的方法?

在方法/构造函数中限制“类型”参数