Scala:理解参数多态性

2023-12-22

有什么区别

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

and

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

假设用法看起来像

drop1(List(1,2,3))

?

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


这真的很简单。你的第一个例子涉及的概念generics.

Generics有一个简单的目标,制定一定的方法generic,例如不依赖于类型。

让我们看一下这个简单的例子。说我想写一个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.

这实质上是说:无论列表中包含的类型是什么,都给我尾巴。 而不是编写数千种变体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

重命名众所周知的库方法通常也是一个坏主意。 Atail操作不安全且drop是安全的。你造成的只是混乱,因为有一个默认值drop method.

List(1, 2, 3) drop 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala:理解参数多态性 的相关文章

随机推荐

  • 使用html5上传浏览器中录制的音频

    我是 HTML Javascript 和公司的新手 所以请原谅我问一个可能很明显的问题 我想构建一个网络应用程序 用户可以在其中上传音频以及一些有关自己的信息 我有一个表格 大部分看起来像这样
  • EC2 上的 Java 8 应用程序

    我想知道是否有人知道我是否可以在 EC2 实例上安装 Java 8 我的应用程序打包为带有嵌入式 jetty 的 fat jar 因此仅 Java 8 运行时就足够了 我对 Linux 不太熟悉 我看到他们在默认 AMI 上只支持 Java
  • C# 中多线程和异步程序的区别

    我最初在 Stackoverflow 和 google 中搜索了类似类型的问题 只有一个链接给出了一些要点 但我无法清楚地理解 1 https social msdn microsoft com Forums en US 3de8670c
  • 如何以编程方式将程序的 CPU 使用率限制在 70% 以下?

    最近 我在构建程序时变得更加注重健康 我观察到大多数程序需要 2 或 3 分钟才能执行 当我检查任务调度程序时 我发现它们消耗了 100 的 CPU 使用率 可以我在代码中以编程方式限制这种用法 这肯定会让我能够在给定时间运行多个程序 谢谢
  • 一旦按下按钮,Java 键事件就不会执行

    您好 希望有人能告诉我我的关键事件做错了什么 我正在使用卡片布局来浏览我的两个 JPanels atm 为此 我使用操作事件和关键事件 当按下按钮时 动作事件将在 JPanel 之间切换 而当按下按键时 按键事件将隐藏按钮 按键事件一切顺利
  • asp.net MSDeployEnableWebConfigEncryptRule 无法加密 web.config

    我已经添加了
  • Rails:注册后设计登录

    我正在使用 Devise 来实现用户注册 登录 我希望用户注册成功后能够自动登录 我怎样才能做到这一点 可能情况是默认情况下设计这个 但也许我在某个地方禁用了该设置 我不记得了 你必须 1 将用户注册到设备网站 2 登录用户 对于选项 1
  • 无需矢量扫描即可查找给定区间内的值

    带有R包data table是否可以在不对数据进行全矢量扫描的情况下找到给定区间内的值 例如 gt DT lt data table x c 1 1 2 3 5 8 13 21 34 55 89 gt my data table funct
  • 如果我的测试中有验证,期望是否多余?

    我对期望和验证的目的和区别感到困惑 例如 Tested FooServiceImpl fooService Injectable FooDao fooDao Test public void callsFooDaoDelete throws
  • 如何从 MSI 检查产品的已安装版本

    在查看了这个网站上的很多帖子后 我最终决定把我的帖子放上来 我正在使用 Wix 准备 MSI 文件 在安装系统之前 我需要检查是否安装了特定版本的企业产品 我有该产品的 GUID 所有版本都相同 但我需要检查是否安装了 1 10 0 版本
  • Angular ng 选择所需选项

    我无法找到如何使用 ng select 中所需的选项 我已经尝试过这个
  • 贝塞尔曲线在 HTML5 画布中绘制拉伸椭圆

    这种绘制椭圆的方法看起来干净而优雅 http www williammalone com briefs how to draw ellipse html5 canvas http www williammalone com briefs h
  • Rainlendar 如何使用 wxWidgets 实现透明度

    雷恩伦达尔 http www rainlendar net cms index php是一个很棒的跨平台日历程序 是用 wxWidgets 编写的 它是如何实现透明效果的呢 有谁有演示透明效果的示例代码吗 我的猜测是他们可能会使用wxScr
  • dllimport 无法找到 dll,即使它位于 PATH 中

    我使用 Dllimport DllName dll 我确信进程 PATH 环境变量中存在我的 dll 的路径 并且仍然 我收到 找不到 DllName dll 找不到 DllName dll 也可能意味着 DllImport 尚未找到 Dl
  • 删除滚动条但不删除滚动功能[重复]

    这个问题在这里已经有答案了 我知道你可以定义溢出 隐藏 在 HTML 正文上删除滚动条 但我希望仍然能够使用鼠标上的箭头或滚轮滚动 预先感谢您的任何帮助 编辑 感谢您有关悬停滚动条和自定义栏的所有建议 还要感谢您对删除滚动条影响用户体验的所
  • 捆绑包和文件访问

    我已向我的项目添加了一系列文件夹 使用 添加现有文件 选项 这会导致文件夹内容在 Xcode 中显示为蓝色文件夹 以下作品 NSString imageName NSString stringWithFormat File 03 image
  • PowerShell 范围标识符

    我是 PowerShell 新手 试图更好地理解范围 有没有办法从范围内识别范围 某些变量或函数可以给我某种范围名称或范围 Guid 或范围 Id 例如 我如何知道本地范围是否是全局范围 例如 我如何知道本地范围是否是全局范围 bool i
  • 如何验证传递给“PrincipalContext”的凭据

    这是后续我之前的问题 https stackoverflow com questions 50055073 testing a principalcontext using validatecredentialsnull null beha
  • ant 的 componentdef 错误

    我有一个相对较旧的 Grails 应用程序 它使用 ant 来构建应用程序 在测试服务器中 它构建没有任何问题 但是当我尝试在我的电脑上运行它时 我收到一致的错误 Caused by jar file C ant apache ant 1
  • Scala:理解参数多态性

    有什么区别 def drop1 A l List A l tail and def drop1 l List Int l tail 假设用法看起来像 drop1 List 1 2 3 何时应该使用其中之一 为什么 虽然我可以理解第二个例子