如何在 Scala 中为泛型类型提供默认类型类?

2024-03-03

在 Scala 中,如果你创建一个类型类,比如代数结构Monoid[T],您可以为不同类型的幺半群提供许多默认类型类实现。

假设幺半群定义为:

trait Monoid[T] {
  def op(x: T, y: T): T
  def id: T
}

Since Strings 在串联操作下形成一个幺半群,我们可以为String像这样:

implicit object StringMonoid extends Monoid[String] {
  override def op(a: String, b: String): String = a + b
  override def id: String = ""
}

这相当容易,因为String不是泛型类型。

我要求的是如何提供默认的幺半群Seq[T]s,其中类型参数阻止我像上面那样创建隐式对象。

我可以做:

class SeqMonoid[T] extends Monoid[Seq[T]] {
  override def op(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b
  override def id: Seq[T] = Nil
}
implicit object intSeqMonoid extends SeqMonoid[Int]
implicit object doubleSeqMonoid extends SeqMonoid[Double]
implicit object stringSeqMonoid extends SeqMonoid[String]
...

但这种方法没有利用泛型类型的优点。

所以,总的来说,我的问题是:Scala 有什么方法我可以提供泛型类型的类型类实现?


您可以提供具有所需类型的隐式函数:

implicit def SeqMonoid[T]: Monoid[Seq[T]] = new Monoid[Seq[T]] {
  override def op(a: Seq[T], b: Seq[T]): Seq[T] = a ++ b
  override def id: Seq[T] = Nil
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala 中为泛型类型提供默认类型类? 的相关文章

随机推荐

  • 检查字符串中的任何字符是否是字母数字

    我想检查字符串中的任何字符是否是字母数字 我为此编写了以下代码并且运行良好 s input temp any i isalnum for i in s print temp 我的问题是下面的代码 它与上面的代码有什么不同 for i in
  • C# Linq 中的多级包含

    我想在我的 linq 语句中包含 MULTILEVEL 例如 var a departments include u gt u Customers include u gt u Customers Include u gt u Orders
  • 使用列表的递归 - Haskell

    我正在尝试编写一个递归函数 该函数将包含整数列表的列表作为输入并返回类型为 Int Int 的元组 Int Int 这是一个 棋盘游戏 您将获得一个棋盘 5 4 3 8 6 0 2 1 0 7 0 1 9 4 3 2 3 4 0 9 这将是
  • Excel 两个时间之间的 IF AND 公式

    我想要一个公式 它可以告诉我单元格中的时间是否在其他单元格中的两个单独值之间 如果是 则返回一个值 我已经创建了下面的代码 但这根本不返回任何值 IF AND F4 gt R 1 F4
  • 在 PostgreSQL 中创建约束时,有没有办法处理 JSON 数组的所有元素?

    PostgreSQL 是否提供任何符号 方法来施加约束eachJSON 数组的元素 一个例子 create table orders data json insert into orders values order id 45 produ
  • Python:repr 与反引号

    在Python中 有什么区别repr和反引号 1 左边 用于演示 class A object def repr self return repr A def str self return str A gt gt gt a A gt gt
  • 如何在 AspNet5 / Mvc6 中检测 dnx451 Web 应用程序关闭?

    为了能够关闭后台进程 使用 Quartz Net 实现 我需要检测 AspNet5 beta8 中的 Web 应用程序关闭 在以前版本的 Asp Net 中 可以在 Application End 上执行代码 AspNet5 中的 Appl
  • 如何从BitmapImage获取BitmapSource?

    如何从BitmapImage获取BitmapSource 或者如何直接将BitmapImage转换为BitmapFrame 在我看来 如果我有 BitmapSource 我可以使用 BitmapFrame Create 并最终从给定的 Bi
  • Netbeans GUI 预览与运行时视图不同

    我正在使用 NetBeans 及其 GUI 编辑器开发一个简单的 Java 应用程序 我坚持创建一个简单的对话框 运行时它看起来与我设计的以及编辑器中预览的不同 基本上 单击按钮就会出现我的对话框 private void jButton1
  • 模拟 GCC 语句表达式

    我被迫使用 IAR EW430 编译器 v7 12 进行嵌入式项目 并且它仅正式支持 c99 我希望能够通过除了编写一堆专用内联函数之外的任何方式以通用方式模拟 GCC 的语句表达式 有什么办法可以实现这一点吗 也许使用 MACRO wiz
  • 在 Jupyter Notebook 中的任意位置重命名变量

    有没有办法重命名当前 jupyter 笔记本文件中各处的变量 IE 假设我的笔记本通过我的脚本在多个函数和位置引用变量 foo 后来我决定将此变量重命名为 bar 以获得更好的可读性 在 Xcode 中 您可以突出显示并右键单击来执行此操作
  • 如何使用 Webdriver 和 C# 通过 Selenium 定位并单击嵌套在多个框架和框架集中的元素

    我有如下所示的 html 页面 我需要单击 clslogin 类中的 登录 如何遍历找到登录名 我正在使用 C 和 selenium Webdriver 使用 XPath html body div table tbody tr 1 td
  • 它如何获得比我想要的更多的内存?(C++)[重复]

    这个问题在这里已经有答案了 我想要一个1整数内存 但是这个程序如何工作呢 Code include
  • Passport-jwt 令牌过期

    我正在使用 Passport jwt 生成我的令牌 但我注意到令牌永远不会过期 有没有办法根据为我设置的规则使特定令牌失效 例如 use strict const passport require passport const passpo
  • 为python配置Vs code 2.0.0版本构建任务

    我需要帮助来配置我的 Vs 代码以使用 Cntrl Shift B 在 python 中运行脚本 我工作得很好 直到 Vs 代码升级到版本 2 0 0 现在它要求我配置构建 我不知道构建是什么 过去 当我只需要配置任务运行程序时 它效果很好
  • 计算圆交点 O( (n+s) log n)

    我试图弄清楚如何设计一种算法 可以以 O n s log n 复杂度完成此任务 s 是交叉点的数量 我尝试在互联网上搜索 但找不到真正的东西 无论如何 我意识到拥有良好的数据结构是关键 我在java中使用红黑树实现 TreeMap 我还使用
  • Solr 索引 My SQL 时间戳或日期时间字段

    要在 Solr 中索引日期 日期应采用 ISO 格式 我们可以在不修改 SQL Select 语句的情况下索引 MySQL Timestamp 或 Date Time 字段吗 我用过
  • 如何使用 Flask 和 sqlalchemy 进行选择查询?

    我是 Flask 和 SQLAlchemy 的新手 我在 postgress 有一个数据库 该数据库有表 数据 200 条记录 我想做一个 Select 语句 但当我这样做时总是给我同样的错误 这是我的代码 这是我的模型 py from s
  • DateTime.AddYears 在闰年的行为

    在 DateTime 上使用 AddYears 方法时 任何人都可以解释 NET 中闰年计算背后的数学或简单推理吗 如果您将 2012 年 2 月 29 日加上一年 您将得到 2013 年 2 月 28 日 而不是 2013 年 3 月 1
  • 如何在 Scala 中为泛型类型提供默认类型类?

    在 Scala 中 如果你创建一个类型类 比如代数结构Monoid T 您可以为不同类型的幺半群提供许多默认类型类实现 假设幺半群定义为 trait Monoid T def op x T y T T def id T Since Stri