我们可以通过参数调用多态的scala函数而不是无形的吗?
Can we call scala functions polymorphic by parameter without shapeless
我在谈论这个(而且只谈论参数多态性):
def fun1[T](s: Set[T]): Option[T] = s.headOpton
我在一些地方看到人们将此称为原始 Scala 中 T
周围的多态函数示例 - 类似于无形 Set ~> Option
。
但是我不明白为什么我们可以称它为多态。尽管我们似乎能够通过 Set[Int]
和 Set[String]
实际上 fun1[Int]
和 fun1[String]
是两个不同的函数。我想我可以声称因为 fun1
的 eta 扩展是错误的并且没有给我们想要的东西:
scala> fun1 _
res0: Set[Nothing] => Option[Nothing] = <function1>
并且我们在扩展的时候总是需要提到一个类型:
scala> fun1[Int]_
res1: Set[Int] => Option[Int] = <function1>
我正在尝试研究 shapeless,并尝试将它与原始 scala 进行比较 - 这就是问题的来源。我理解正确吗?
fun1
实现不依赖于类型 T
因此一般写成 :
Using parametric polymorphism, a function or a data type can be
written generically so that it can handle values identically without
depending on their type.
(来源Wikipedia)
我同意你提到 fun1[Int]
和 fun1[String]
"are two different functions"。这些正在采用 "concrete type":
Parametric polymorphism refers to when the type of a value contains
one or more (unconstrained) type variables, so that the value may
adopt any type that results from substituting those variables with
concrete types.
(来源Haskell wiki)
编辑 在@Travis 和@Miles 评论后:
正如 Travis 清楚解释的那样,我们可以在 "plain scala" 中使用 多态方法 ,但不能使用 多态函数 。在 this article 中,Miles 使用 Poly
实现了这个问题中提到的多态函数:
object headOption extends PolyFunction1[Set, Option] {
def apply[T](l: Set[T]): Option[T] = l.headOption
}
scala> headOption(Set(1, 2, 3))
res2: Option[Int] = Some(1)
我在谈论这个(而且只谈论参数多态性):
def fun1[T](s: Set[T]): Option[T] = s.headOpton
我在一些地方看到人们将此称为原始 Scala 中 T
周围的多态函数示例 - 类似于无形 Set ~> Option
。
但是我不明白为什么我们可以称它为多态。尽管我们似乎能够通过 Set[Int]
和 Set[String]
实际上 fun1[Int]
和 fun1[String]
是两个不同的函数。我想我可以声称因为 fun1
的 eta 扩展是错误的并且没有给我们想要的东西:
scala> fun1 _
res0: Set[Nothing] => Option[Nothing] = <function1>
并且我们在扩展的时候总是需要提到一个类型:
scala> fun1[Int]_
res1: Set[Int] => Option[Int] = <function1>
我正在尝试研究 shapeless,并尝试将它与原始 scala 进行比较 - 这就是问题的来源。我理解正确吗?
fun1
实现不依赖于类型 T
因此一般写成 :
Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type.
(来源Wikipedia)
我同意你提到 fun1[Int]
和 fun1[String]
"are two different functions"。这些正在采用 "concrete type":
Parametric polymorphism refers to when the type of a value contains one or more (unconstrained) type variables, so that the value may adopt any type that results from substituting those variables with concrete types.
(来源Haskell wiki)
编辑 在@Travis 和@Miles 评论后:
正如 Travis 清楚解释的那样,我们可以在 "plain scala" 中使用 多态方法 ,但不能使用 多态函数 。在 this article 中,Miles 使用 Poly
实现了这个问题中提到的多态函数:
object headOption extends PolyFunction1[Set, Option] {
def apply[T](l: Set[T]): Option[T] = l.headOption
}
scala> headOption(Set(1, 2, 3))
res2: Option[Int] = Some(1)