映射到同类 Traversable 的 Traversable 类型

2024-02-21

简洁版本。Scala 中的大多数泛型集合都有一个map实际上,该方法将返回相同类型的集合。 (List[A].map(f:A=>B)返回一个List[B]例如。)Scala 集合库就是为了实现这一目标而明确设计的。如果我想编写对任何此类集合具有多态性的代码该怎么办?能 ”Traversable谁的映射的行为类似于函子的“是否”被表示为类型?

长版。我遇到的情况是,用一个抽象来表示某些对象的集合会很有用。C当前类型,这样如果这些对象被转换为某种D所需的类型,那么集合可以使用这些对象来构造某些类型的对象R结果类型。通过使用函数类型,我几乎可以实现我想要的一切

(C => D) => R

但这种方法的一个缺陷是自然的过度懒惰(在我的应用程序中)map方法,类似于

def map[C2](f: C=>C2): (C2=>D)=>R = (g => this(f andThen g))

这会延迟应用f到类型的对象C直到R正在计算中。我宁愿申请f立即地。

因此,例如,我可能会实现类似的东西

class Foo[+C,-D,+R](cs: List[C], finalize: List[D]=>R) {
    def apply(f: C=>D): R = finalize(cs.map(f))
    def map[C2](f: C=>C2): Foo[C2,D,R] = Foo(cs.map(f), finalize)
}

到目前为止,一切都很好。但现在我想,没什么特别的List这里;任何实现某种类型的构造函数map函数就可以了。唯一的一点就是这个功能finalize可能依赖于集合的结构。例如,也许列表的第一个元素被特殊对待,所以如果List.map返回一些更通用的集合类型,可能是一个非常抽象的集合,甚至没有“第一个元素”的概念,然后finalize可能会失败。同样,如果它期望列表具有一定的长度,但我过滤列表或其他内容。

如果我以其自然的通用性编写代码,就不会出现这种问题,例如

class Foo[+C,-D,+R,F[x] <: Traversable[x]](cs: F[C], finalize: F[D]=>R) {
    ...
}

因为这样我就不会不小心做任何奇怪的事情了F(除非我在运行时检查它的类型或其他什么,在这种情况下我应得的)。

唯一剩下的问题是cs.map(f)具有静态类型Traversable[D], not F[D],尽管我们当然希望它实际上是类型F[D]通常情况下,Scala 集合库的明确设计就是为了确保这一点。

所以我的问题是,这个要求可以吗F用类型来表达?


本质上,我想要 Haskell 代码的 Scala 版本

data Foo f b r a = Foo (f a) (f b -> r)
instance (Functor f) => Functor (Foo f b r) where
    g `fmap` (Foo fa fbr) = Foo (g `fmap` fa) fbr
dothething :: (Functor f) => Foo f b r a -> (a -> b) -> r
dothething foo g = fbr fb where Foo fb fbr = g `fmap` foo

具有或多或少相同的保证并且没有懒惰。


您在寻找 scalaz 的 Functor 吗?

https://github.com/scalaz/scalaz/blob/scalaz-7/core/src/main/scala/scalaz/Functor.scala https://github.com/scalaz/scalaz/blob/scalaz-seven/core/src/main/scala/scalaz/Functor.scala

它允许您对任何可以满足类型类定义的事物进行抽象。

def addTwo[F[_]](f: F[Int])(implicit F: Functor[F]): F[Int] = f.map(_+2)

现在我的“addTwo”方法不关心正在映射的内容,只要存在函子实例即可。所以这两个都可以工作:

addTwo(List(1,2,3))
addTwo(Future { 1 } ) 

etc.

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

映射到同类 Traversable 的 Traversable 类型 的相关文章

随机推荐

  • 在 ElasticSearch Nest 客户端中创建自定义分析器

    我对使用 Nest 客户端的 Elasticsearch 非常陌生 我正在使用自定义分析器创建索引 但是在使用分析进行测试时 它似乎没有使用自定义分析器 主要是没有出现edgengram标记 我是否缺少任何东西可以使我的自定义分析器成为索引
  • Python从列表中删除项目[重复]

    这个问题在这里已经有答案了 我有一个给定格式的列表 John Smith Linus Torvalds Bart Simpson 列表 Linus Torvalds 中有一些这样的元素 我想删除它们 那么为什么下面的代码不删除它们呢 for
  • 在站点之间传递凭据

    我在具有两个不同域的两台不同服务器上运行两个不同的站点 一个站点运行 Joomla 另一个站点运行 Moodle 我已将 Moodle 服务器配置为基于 Joomla 站点上的用户表进行身份验证 因此我们拥有权威的用户信息来源 我想做的是
  • Android - 如何解析 JSONObject 和 JSONArrays

    我的版本是 Android 2 2 Google API 8 我从模拟器运行 我正在尝试尝试访问此 JSON 对象中的位置 我使用后得到这个 InputStream instream entity getContent JSONObject
  • WIFI变化的广播动作

    在我的应用程序中 每当设备连接或断开 WIFI 网络时我都必须收到通知 为此我必须使用BroadcastReceiver但是在阅读了关于 SO 的不同文章和问题后 我有点困惑我应该为此使用哪种广播操作 在我看来 我有三个选择 SUPPLIC
  • Vaadin:小部件集未加载。

    我能够将 Vaadin 模块集成到我们基于 Spring 的应用程序中 集成后 我想运行甘特图的演示 它是 Vaadin 的附加组件 并在 github 上找到了它here https github com tltv gantt 文件夹内有
  • 类型“System.Data.Entity.DbContext”是在未引用的程序集中定义的。您必须添加对程序集“EntityFramework 2”的引用

    我有一种解决方案 一个项目是带有 edmx 数据模型的类库 另一个是asp net web 表单项目 当我开始解决方案时 出现以下异常 类型 System Data Entity DbContext 是在未引用的程序集中定义的 您必须添加对
  • Tailwind 自定义主题颜色不透明度未应用

    我正在研究一个Reactjs使用的项目顺风 CSS作为我的 CSS 框架 我正在尝试构建一个具有自定义颜色的主题 我将颜色定义为 CSS 变量index css文件 但设置 alpha 值对这些颜色不起作用 这是我的颜色值的 CSS lay
  • MongoDB - 清除嵌套数组中的项目

    如果我的模式中有一个嵌套数组 我如何告诉 MongoDB 删除其特定模型的条目 Schema var UserSchema new Schema username String documents Number 我尝试过这样的事情 db u
  • Xcode5:无法注册“/System/Library/CoreServices/CoreTypes.bundle/Contents/Library/MobileDevices.bundle

    我的库有一些类型转换器 我正在注册一些 OSX 和 iOS 类型转换器 如下所示 当我为 iOS 进行编译时 我收到一些与无法找到 UIKit 相关的错误 以下是我针对 iOS 进行编译的方法 xcodebuild destination
  • 将 ViewPager 与不带 actionBar 的选项卡一起使用

    我正在使用名为EffectiveNavigation 的谷歌示例来创建带有选项卡的ViewPager 问题是在清单中 对于我的主要活动 我设置了 android theme android style Theme Holo NoAction
  • 多个表的视图。需要删除 1 个表定义的“双打”

    好吧 这就是我所坚持的 Full size https i stack imgur com AEIjH png SELECT dbo InstellingGegevens INST SUBTYPE dbo InstellingGegeven
  • 如何绘制这些数据?

    我有一个值数组theta and phi 如何轻松创建 MATLAB 绘图 其中theta and phi是这样的球坐标 如果我有一个数组 如何在 MATLAB 中绘制值theta and phi半径保持不变 这些是theta theta
  • pandas 时间戳与日期时间的性能较慢

    我似乎遇到了 pandas Timestamp 与 python 常规 datetime 对象的算术运算性能出乎意料的缓慢 这是一个基准测试 演示了 import datetime import pandas import numpy us
  • 找不到模块:无法解析“swiper/react”

    我在使用最新版本的 Swiper 时也遇到了同样的问题 它在我之前的项目中有效 但现在不起作用 连那个版本都没有 最新版本也试过了 这是我的代码 Import Swiper React components import Swiper Sw
  • xtext 自定义作用域:函数参数

    我正在尝试自定义作用域 这样 如果我的语言中有类似函数的东西可以获取参数 我希望这些参数仅在出现分号之前才可见 而在这个范围之外 我希望它不可见 我尝试在文件 MyDslScopeProvider xtend 中重新定义方法 getScop
  • 在我获取输入数据之前,什么会对其进行重新格式化?

    我有一个数据湖存储帐户 我有一个充满包含 JSON 格式数据的文件的目录 其中包括一些包含 ISO 8601 格式时间的字符串值 即 reading time 2008 09 15T15 53 00 91077 现在 当我使用数据工厂创建管
  • Android中保存同一个Activity的多个实例状态

    我正在开发一个 Android 应用程序 当数据来自使用相同额外内容的相同 Activity 时 我希望避免重新加载类似数据 具体来说 当我使用 extra 启动 Activity A 时 我使用这个 extra 从服务器加载远程数据 通过
  • Android Studio:“Gradle 同步失败:无法从选定的 JDK 运行 JVM。”

    自从安装Android Studio 3 2后 我一直无法运行Java 我尝试过jdk 8u181 windows x64 jdk 10 0 2 windows x64 bin jdk 11 windows x64 bin 环境PATH并重
  • 映射到同类 Traversable 的 Traversable 类型

    简洁版本 Scala 中的大多数泛型集合都有一个map实际上 该方法将返回相同类型的集合 List A map f A gt B 返回一个List B 例如 Scala 集合库就是为了实现这一目标而明确设计的 如果我想编写对任何此类集合具有