Scala 泛型和数字隐式

2024-03-13

我需要将两个函数作为参数传递给 scala 函数。然后,该函数应该评估它们并从中获取一个数字,然后对其进行操作。该数字可以是 Int、Double 或任何其他数字类型。我希望该函数能够工作,无论它使用什么类型。

下面的例子解释了这个问题。

import Numeric.Implicits._

class Arithmetic[T : Numeric](val A: Connector[T], val B: Connector[T]) {
  val sum  = new Connector({ A.value + B.value })
}

class Constant[T](var x: T) {
  val value = new Connector({ x })
}

class Connector[T](f: => T) {
  def value: T = f
  override def toString = value.toString()
}

object Main extends App{
  val n1 = new Constant(1)

  // works
  val n5 = new Constant(5)
  val a = new Arithmetic( n1.value, n5.value )
  println(a.sum)

 // no works
 val n55 = new Constant(5.5)
 val b = new Arithmetic( n1.value, n55.value )
 println(b.sum)

}

我也尝试过

class Arithmetic[T,R : Numeric](val A: Connector[T], val B: Connector[R]) {

和其他几种组合,但我最终得到了

error: could not find implicit value for parameter num: scala.math.Numeric[Any]
val sum  = new Connector({ A.value + B.value })

您看到的错误消息是因为Numeric[T].plus只能用于将两个值相加同类型 T。 您的代码是在数字加宽自动发生的假设下编写的 - 在这种情况下不会发生,因为编译器不知道有关类型的任何信息,除了存在一个Numeric[T]实例。

如果你需要sum要成为稳定的值,您必须在构造函数中提供必要的类型信息,如下所示:

class Arithmetic[A : Numeric, R <% A, S <% A](val a: Connector[R], b: Connector[S]) {
  val sum = new Connector[A]((a.value:A) + (b.value:A))
}

这需要类型R and S可以转换成某种类型A对于其中一个Numeric[A]距离已知。 创建实例时,您始终必须提供所有类型参数,因为无法推断它们。

如果你不需要sum为了稳定,你可以将你的课程更改为:

class Arithmetic[A,B](val a: Connector[A], val b: Connector[B]) {

  // if A and B are the same types
  def sum(implicit e: B =:= A, n: Numeric[A]): Connector[A] =
    new Connector(n.plus(a.value, b.value))

  // else widen to C
  def wideSum[C](implicit f: A => C, g: B => C, n: Numeric[C]) =
    new Connector(n.plus(a.value, b.value))
}

val a = new Connector(1)

val b = new Connector(2)

val c = new Connector(3.0)

val d = (new Arithmetic(a,b)).sum

// val e = (new Arithmetic(b,c)).sum // <-- does not compile

val e = (new Arithmetic(b,c)).wideSum[Double]

当扩大时,您仍然需要提供类型信息。

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

Scala 泛型和数字隐式 的相关文章

  • 解析嵌套括号内包含的值

    我只是在开玩笑 奇怪地发现在简单的递归函数中解析嵌套括号有点棘手 例如 如果程序的目的是查找用户详细信息 它可能来自 name surname age to Bob Builder age 然后到Bob Builder 20 这是一个用于在
  • Spark Scala:按小时或分钟计算两列的 DateDiff

    我在数据框中有两个时间戳列 我想获取它们的分钟差异 或者小时差异 目前我可以通过四舍五入获得日差 val df2 df1 withColumn time datediff df1 ts1 df1 ts2 但是 当我查看文档页面时https
  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • “函数是第一等值”这到底是什么意思?

    有人可以用一些很好的例子清楚地解释它吗 在解释函数式编程时 我在 Scala 中遇到了这句话 一流 并不是一个正式定义的概念 但它通常意味着一个实体具有三个属性 有可能used 不受限制 只要 普通 值可以 即从函数传递和返回 放入容器等
  • 覆盖 Predef 的隐式转换

    我有多个返回 java lang Integer 的方法 然后使用 Scala 的 Predef 隐式转换将其隐式转换为 Int 下面是它的编写方式there https github com scala scala blob v2 11
  • Scala 中抛出异常,什么是“官方规则”

    我正在 Coursera 上学习 Scala 课程 我也开始阅读 Odersky 的 Scala 书 我经常听到的是 在函数式语言中抛出异常不是一个好主意 因为它破坏了控制流 并且我们通常返回一个失败或成功的 Either Scala 2
  • 如何以最佳方式传递元组参数?

    如何以最佳方式传递元组参数 Example def foo Int Int def bar a Int b Int 现在我想传递的输出foo to bar 这可以通过以下方式实现 val fooResult foo bar fooResul
  • 过滤字符串上的 Spark DataFrame 包含

    我在用火花1 3 0 http spark apache org releases spark release 1 3 0 html and 火花阿夫罗1 0 0 https github com databricks spark avro
  • 如何将 scala 列表转换为 javascript 数组?

    有更简单的方法吗 document ready function var jsArray if scalaList null for id lt scalaList jsArray push id 很简单 如下所示 import play
  • 通用 scala 函数,其输入是变量数量的函数

    我想定义一个函数f需要另一个函数g 我们需要g采取采取n双打 对于某些固定n 并返回一个 Double 函数调用f g 应该返回具体值n 例如 f Math max 2因为 Math sin 具有类型 Double Double gt Do
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 在 Akka 中配置嵌套 Router

    我有一些嵌套的路由器 应创建它FromConfig 我想要的是这样的 test akka actor deployment worker router round robin nr of instances 5 slave router b
  • 继承的静态成员的静态初始化

    考虑这个示例代码 public class A
  • 如何从命令行向 REPL 添加导入?

    如何使 REPL 导入命令行中给出的包 Sample scala someMagicHere import sys error scala gt imports 1 import scala Predef 162 terms 78 are
  • 在 Kotlin 中创建 Spring 的 ParameterizedTypeReference 实例

    我正在尝试学习 Kotlin 并测试它如何与 Spring Boot 配合使用 我的应用程序使用 mongo 数据库来存储数据 并且我有用于检索数据的 Jersey 资源 我正在使用它进行测试spring boot test and Res
  • Scala 宏的位置怎么了?

    我试图获取宏参数的原始输入字符串 但返回的位置似乎有点偏离 考虑这个宏 例如 object M import scala reflect macros Context import language experimental macros
  • HashPartitioner 是如何工作的?

    我阅读了文档HashPartitioner http spark apache org docs 1 3 1 api java index html org apache spark HashPartitioner html 不幸的是 除了
  • 模拟 BlazeClientBuilder[IO] 以返回模拟客户端[IO]

    我正在使用BlazeClientBuilder IO resource方法得到Client IO 现在 我想模拟客户端进行单元测试 但不知道该怎么做 有没有一个好的方法来嘲笑这个 我会怎么做 class ExternalCall val r
  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 在 Spark MLlib 上使用 Java 中的 Breeze

    在尝试从Java使用MLlib时 使用微风矩阵运算的正确方法是什么 例如scala 中的乘法很简单 matrix vector 相应的功能在Java中是如何表达的 有一些方法 例如 colon times 可以通过正确的方式调用 breez

随机推荐

  • 如何使用 gspread 缓存 Google Sheets 的授权?

    我正在尝试创建一个简单的函数 将一些数据发布到 Google Sheets 电子表格中 我在 AWS Lambda 中托管此函数 无论如何 代码看起来有点像这样 import gspread from oauth2client servic
  • 添加到数据库后保持在同一页面而不刷新

    我有 PHP 网页 需要在其中插入一些信息到我的数据库中 插入完成后 它会刷新同一页面 但我被告知这个过程不切实际 因为你正在加载所有HTML CSS and JS每次都会显示您的页面 我应该你AJAX要做到这一点 我搜索它 并尝试了这段代
  • find_in_set 与 laravel 中的 join

    如何使用 Laravel 查询获取所需的输出 尝试过这种方式没有成功请指导提前非常感谢 如果可能的话 我们有什么方法可以在模型中设置它 请指导 User id name b id 1 Alax 1 3 2 Rex 2 4 3 Lex 2 3
  • jQuery droppable out 事件无法触发?

    LWdrop droppable accept LW drop function event ui ui draggable addClass LWactive this droppable option accept this css b
  • 如何避免重复出现消息“更新被拒绝,因为远程包含您所做的工作...”?

    我正在与另外三个合作者一起参与一个项目 我的情况是 每次我尝试添加新提交并且远程中存在一些更改 即使它是我未在本地工作过的文件 时 我都会收到以下消息 迫使我使用以下默认消息创建合并 error failed to push some re
  • 从表单生成表格

    我有一个表单组 public transactionOrRefundRequestForm FormGroup new FormGroup SaleRequest new FormGroup Header new FormGroup Typ
  • Perl 中有 zip 和 Fold 等函数吗?

    我想使用一些功能 例如 zip http zvon org other haskell Outputprelude zip f html fold http www haskell org haskellwiki Fold and map
  • Java:使用 double 不准确[重复]

    这个问题在这里已经有答案了 可能的重复 在java中使用双精度数保持精度 https stackoverflow com questions 322749 retain precision with doubles in java Java
  • 混淆 ASP.Net dll 破坏 Web 应用程序

    我通常不会费心去混淆 Web 应用程序 DLL 但现在我必须与可能有利益冲突的人共享一些服务器空间 并且可能会试图窃取交易并反编译它 我知道这不是一个理想的解决方案 但是嘿 因此 我使用 VS 2005 一个 Web 部署项目 编译为单个
  • Getpass输入Python 3

    我正在尝试创建密码输入 我知道getpass getpass但是当我将其置于闲置状态时 它会出现错误 提示 密码可能会被回显 My code import getpass p getpass getpass print You entere
  • gremlin 语法计算 Jaccard 相似度度量

    我有兴趣计算图中未直接连接的所有顶点对的杰卡德相似度度量 Jaccard度量定义为两个顶点的邻居交集的范数除以相同集合的并集的范数 where 到目前为止 我已经能够获得所有未直接连接的节点对 仅对这种情况下的链接预测感兴趣 如果直接链接已
  • 其可能的 Google 表单脚本每天上午 00:01 至中午 12:00 自动打开和关闭

    我想每天 00 01 打开 google 表单并在 12 00 关闭 这是我的代码 function createDailyTrigger ScriptApp newTrigger openCloseFormTrigger timeBase
  • 由于 Integer.parseInt 导致崩溃

    我正在尝试从另一个文本文件中生成的文本导入文本Activity 生成的文本文件由String ArrayList其中仅包含数字和 Android 生成的其他随机文本 当我从文件导入文本时 我使用的是BufferedReader and re
  • 如何在Python中检查神经网络的层数以及何时应该增加层数?

    请对您的想法添加最少的评论 以便我可以改进我的查询 谢谢 我正在研究MNIST数据集并写一些CNN代码 然而 我对其中的一些观点感到困惑CNN代码 如何知道神经网络的层数 根据我目前的理解 我认为它有 6 层和 4 个隐藏层 是对的吗 如果
  • OpenGL 3:​​glBindVertexArray 使 GL_ELEMENT_ARRAY_BUFFER 无效

    我确信如果你通过绑定缓冲区glBindBuffer 您可以放心地假设它保持绑定状态 直到目标通过另一个调用反弹glBindBuffer 因此 当我发现调用时 我感到非常惊讶glBindVertexArray 将绑定到 GL ELEMENT
  • 在 Node 中渲染 HTML 字符串?

    好吧 我已经下载了 Express 设置端口process env PORT 8080 并设置应用程序变量var app express 现在 我想要完成的是不是通过文件渲染 HTML 我可以通过字符串来完成吗 var html n n n
  • 将 Word 保存为 UTF-8 编码的 HTML

    我正在编写一些 C VSTO 代码 用于读取 Microsoft Word 文档并将其保存到筛选的 HTML 当我对通用 Word 文档执行此函数时 html 文件的输出使用 Windows 字符集 如下所示 如果我打开一个文档并转到 文件
  • 自定义验证摘要模板 Asp.net MVC 3

    我正在开发一个使用 Asp Net MVC3 的项目 在我的视图中 Html ValidationSummary true 像往常一样它会产生 div class validation summary errors ul li Someth
  • Twinx/Secondary-y:不要从第一种颜色开始

    我有一个配色方案来自 plt style use ggplot so 我不想手动选取颜色 或从颜色循环器中选取它们 但是 当我有辅助轴时 fig ax plt subplots ax2 ax twinx ax plot np array 1
  • Scala 泛型和数字隐式

    我需要将两个函数作为参数传递给 scala 函数 然后 该函数应该评估它们并从中获取一个数字 然后对其进行操作 该数字可以是 Int Double 或任何其他数字类型 我希望该函数能够工作 无论它使用什么类型 下面的例子解释了这个问题 im