Scala 元组的通用“映射”函数?

2023-12-30

我想使用返回类型 R 的单个函数来映射 Scala 元组(或三元组,...)的元素。结果应该是具有 R 类型元素的元组(或三元组,...)。

好的,如果元组的元素来自相同类型,则映射不是问题:

scala> implicit def t2mapper[A](t: (A,A)) = new { def map[R](f: A => R) = (f(t._1),f(t._2)) }
t2mapper: [A](t: (A, A))java.lang.Object{def map[R](f: (A) => R): (R, R)}

scala> (1,2) map (_ + 1)
res0: (Int, Int) = (2,3)

但是是否也可以使该解决方案变得通用,即以相同的方式映射包含不同类型元素的元组?

Example:

class Super(i: Int)
object Sub1 extends Super(1)
object Sub2 extends Super(2)

(Sub1, Sub2) map (_.i)

应该返回

(1,2): (Int, Int)

但我找不到解决方案,以便映射函数确定 Sub1 和 Sub2 的超类型。我尝试使用类型边界,但我的想法失败了:

scala> implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }
<console>:8: error: X is already defined as type X
       implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }
                                                                    ^
<console>:8: error: type mismatch;
 found   : A
 required: X
 Note: implicit method t2mapper is not applicable here because it comes after the application point and it lacks an explicit result type
       implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }

Here X >: B似乎覆盖X >: A。 Scala 不支持多种类型的类型边界吗?如果是,为什么不呢?


我认为这就是您正在寻找的:

implicit def t2mapper[X, A <: X, B <: X](t: (A,B)) = new {
  def map[R](f: X => R) = (f(t._1), f(t._2))
}

scala> (Sub1, Sub2) map (_.i)                             
res6: (Int, Int) = (1,2)

一种更“实用”的方法是使用两个独立的函数:

implicit def t2mapper[A, B](t: (A, B)) = new { 
  def map[R](f: A => R, g: B => R) = (f(t._1), g(t._2)) 
}       

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

Scala 元组的通用“映射”函数? 的相关文章

随机推荐

  • heatmap.2 指定行顺序还是防止重新排序?

    我正在尝试使用 heatmap 2 下面的代码 生成一些对数转换的折叠变化数据图 我想按最后一列中的值 从大到小 对热图中的行进行排序 这些行正在自动排序 我不确定 幕后 使用的精确计算 如图所示 正在执行一些聚类 样本数据 gid 2hr
  • 如何摆脱 SKTextures?

    也许这很容易 但我迷路了 我有一个项目 我必须制作一个全屏动画 使用 8 张 jpg 来模拟页面打开 所以我正在做的是 我有一个全屏显示的 SKSpriteNode 制作 8 个 SKTextures 的数组 使用 SKTexture pr
  • 将脚本调整为多个对象时 Unity 冻结

    我正在努力通过 Unity 扔球并获取球的坐标 应用了两件事 一个用于身体动作的脚本和一个用于落球的脚本 我认为这两个代码的运行没有问题 因为当我将脚本应用于一个球时没有问题 顺便说一句 当球的数量增加到 100 个时 Unity 就会停止
  • QOpenGLWidget 在 update() 上停止重画

    我有一个自定义 QDialog 其中包含一个具有 4 个独立实例的层次结构QOpenGLWidget 这些中的每一个QOpenGLWidget有自己的 GL 上下文 并渲染不同的场景 我有一个循环调用update 推荐的重新绘制方法 在每个
  • 在构建时更新 dSYM 中的 CFBundleShortVersionString?

    我将其用作项目中的构建阶段 export PLISTBUDDY usr libexec PlistBuddy export INFO CODESIGNING FOLDER PATH Info plist export RXREVISION
  • 是否可以向在参数中传递的提交按钮添加一个值?

    我正在尝试向我的应用程序添加 预览 按钮 页面 有没有一种方法可以向我的 发布 和 预览 提交按钮添加不同的值 这些按钮在参数哈希中传递 以便我可以检查在控制器中按下了哪个按钮并相应地渲染视图 这是最好的方法吗 的按键params哈希只是n
  • C++:友元声明‘声明非模板函数

    我遇到了超载问题 lt lt 流运算符 我找不到解决方案 template
  • Keras - model.evaluate() 和 model.predict() 之间有什么区别

    我有两个问题 1 model evaluate 和 model predict 有什么区别 2 Keras 如何计算其中每一项 model evaluate预测值并计算给定数据集上模型的损失和所有附加指标 它返回一个列表 其中包含一个值中的
  • File.ReadLines 没有锁定吗?

    我可以用以下命令打开 FileStream new FileStream logfileName FileMode Open FileAccess Read FileShare ReadWrite 无需锁定文件 我可以做同样的事情File
  • 注意:使用未定义的常量 ENT_HTML5 - 假定为“ENT_HTML5”

    我正在尝试创建一个接受 htmlspecialchars 参数的简单方法 虽然我收到 PHP 通知 使用未定义的常量 ENT HTML5 假定为 ENT HTML5 有什么想法可能导致这种情况吗 Encode string param ar
  • 乘客问题 - Apache

    在 Ubuntu 10 04 LTS 的 Linode 切片中运行 我收到 500 内部服务器错误 Apache 日志有 Apache 2 2 14 Ubuntu Phusion Passenger 2 2 7 配置 恢复正常操作 捕获 S
  • Django 返回带有 L 的用户模型 ID

    这个问题直到现在才出现 这里是 当我尝试从用户模型获取用户 ID 时 它返回用户 ID 和字母 L gt gt gt from django contrib auth models import User gt gt gt u User o
  • Java:如果我的程序有一个实例正在运行,我如何检测它,然后关闭旧的实例

    我只想运行我的程序的一个实例 但我希望它能关闭旧的 如果它们打开的话 这是在Java中 如果应用程序是使用启动的Java网络启动 http www java com en download faq java webstart xml它可以访
  • 我可以以编程方式列出 Images.xcassets/Something 中的文件吗?

    是否可以列出 Images xcassets Something 中的所有图像 以便我可以在表格列表视图中显示它们 我试过了 NSArray pngs NSBundle pathsForResourcesOfType png inDirec
  • 如何使用 DropZone.js 获得更高质量的缩略图?

    我正在使用 DropZone 将文件上传到我的服务器 默认设置就可以了 但是照片有点小 我决定进入 dropzone css 文件并将默认参数更改为 250px x 250 px 而不是 100px x 100px dropzone pre
  • spring-data-redis Jackson 序列化

    我正在尝试使用 spring data redis 的 Jackson 序列化功能 我正在构建一个 ObjectMapper 并使用 GenericJackson2JsonRedisSerializer 作为 redisTemplate 的
  • 短变量声明和“声明变量但未使用”错误

    我偶然发现了一个奇怪的问题 以下代码无法编译 func main var val reflect Value var tm time Time if tm err time Parse time RFC3339 2018 09 11T17
  • 使用netty高速发送消息时出现OOM异常

    我用netty编写了一个客户端 以便以高速率发送消息 通过 jConsole 我看到 老一代 正在增加 最后它抛出 java lang OutOfMemoryError 超出 GC 开销限制 是否有一些方法或配置可以避免此异常 以下是我的测
  • 管理每周时间表的数据库架构

    我写这篇文章是因为我想知道是否有人可以帮助我找出简单时间表应用程序的最佳数据库架构 我不知道如何绘制表格来帮助我代表一年中的几周 所有用户都将在其中记录他们每周的工作时间 干杯 非常感谢您的帮助 吉列尔莫 我将与您分享我们使用的一个典型模型
  • Scala 元组的通用“映射”函数?

    我想使用返回类型 R 的单个函数来映射 Scala 元组 或三元组 的元素 结果应该是具有 R 类型元素的元组 或三元组 好的 如果元组的元素来自相同类型 则映射不是问题 scala gt implicit def t2mapper A t