gpt4 book ai didi

Scala:理解参数多态性

转载 作者:行者123 更新时间:2023-12-04 22:46:57 25 4
gpt4 key购买 nike

之间有什么区别

def drop1[A](l: List[A]) = l.tail


def drop1(l: List[Int]) = l.tail

只要用法看起来像
drop1(List(1,2,3))

?

什么时候应该使用其中之一,为什么?虽然我可以理解第二个示例,但我并不真正理解第一个示例的目的。

最佳答案

这真的很简单。你的第一个例子是指 的概念泛型 .

泛型 有一个简单的目标,即制定某些方法通用 ,例如非类型依赖。

让我们看看这个简单的例子。说我想写一个 drop1 List 的方法.

我可以为每种类型写一个:(缓慢,重复):

def drop1(l: List[Int]): List[Int] = l.tail // this only works for Int

def drop1(l: List[String]): List[String] = l.tail // this only works for String

您可以看到如何为每种类型编写上述内容。为了克服这个,你有泛型:
def drop1[A](l: List[A]): List[A] = l.tail // this works for any given type.

这基本上是说:无论 List 中包含的类型是什么,给我尾部。
而不是编写 drop1 的数千个变体对于几乎无限数量的类型,我只需要编写一种。

现在在 Scala 中,您的实现最好通过以下方式完成:
implicit class ListOps[A](val l: List[A]) extends AnyVal {
def drop1: List[A] = l match {
case head :: tail => tail
case Nil => Nil
}
}
// you can now have
List(1, 2, 3).drop1

重命名众所周知的库方法通常也是一个坏主意。一个 tail操作不安全且 drop是安全的。你造成的只是困惑,因为有一个默认值 drop方法。
List(1, 2, 3) drop 1

关于Scala:理解参数多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21115552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com