【发布时间】:2021-02-21 12:51:24
【问题描述】:
到目前为止,我的印象是在 scala 中定义通用函数的唯一方法是使用方法,例如
def myToString[A](value: A) = {println(value)}
但是我想出了以下方法:
val myToStringFun: (T forSome {type T}) => Unit = value => println(value)
有什么我没有看到的,或者是在 Scala 中编写通用函数而不求助于方法的模式?
我以前从未见过这种模式,只是根据我对高等类型和存在主义概念的学习才想出来的......
请分享您对此的想法或智慧......
编辑1:
如果以上是正确的,为什么不使用这种模式,而人们系统地求助于 Method 来实现泛型功能。是否只是为了便于记号
EDIT2:
如果一个函数(T forSome {type T}) => Unit Any => Unit
看来
val mySeqToString: (Seq[T] forSome {type T}) => String = {
case head +: tail => s"$head +: " + seqToString(tail)
case Nil => "Nil"
}
等价于
def seqToString[T](seq: Seq[T]): String = seq match {
case head +: tail => s"$head +: " + seqToString(tail)
case Nil => "Nil"
}
正确吗?
【问题讨论】:
-
这不是一个存在的泛型,在这一点上,这只是 Any 的花哨和令人困惑的语法。
T在任何意义上都不可用,尝试用它编写一个通用标识函数,或者编写一个接受T和Ts的 List 并返回 布尔值的函数 检查列表是否包含该元素。 -
有趣,所以写
def method[F[_]](e: F[T] forSome {type T}): String = ???就像是在说e: F[Any]??? -
Existentials 与 Any 有点不同,特别是因为考虑到对象的变化,它们的行为不同。但是,我个人从来没有发现它们有用(而且,它们总是让我感到惊讶,所以可以说我真的不理解它们)。
-
现有类型也将在 Scala 3 中被删除
-
Scala 3 将拥有正确的polymorphic functions
标签: scala types existential-type