在 Scala 中的 List[Either] 上使用 flatMap

2024-04-23

Either从 Scala 2.12 开始是右偏的,这使得它可以在 for/yield 块中使用,而无需投影,就像Option。但显然这还不足以表现得像Option当与flatMap.

object Main {

  def main(args: Array[String]): Unit = {

    val nums = List.range(1,10)

    println(nums.flatMap(evenOption))
    println(nums.flatMap(evenEither)) // fails

  }

  def evenOption(x: Int): Option[Int]       = if (x % 2 == 0) Some(x) else None
  def evenEither(x: Int): Either[String, Int] = if (x % 2 == 0) Right(x) else Left("not even")

}

我最少的范畴论知识让我认为Either不是一个单子,因此失败了?或者我还能如何使上面的例子起作用?


它与是否是单子无关。当你执行时flatMap某些数据结构上的方法,您传递到的函数必须返回该数据结构的实例。因此,当您对选项进行平面映射时,您的函数必须返回一个选项。如果您要对 Future 进行平面映射,则您的函数必须返回 Future。列表也是如此:列表上的平面映射必须返回列表本身。那么为什么你的List.flatMap(Option)工作和List.flatMap(Either)不是吗?因为存在从 Option 到 Iterable 的隐式转换 (Option.option2Iterable),并且该转换发生在您的示例中。 Either 数据类型没有这样的转换(除非您自己创建它)。

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

在 Scala 中的 List[Either] 上使用 flatMap 的相关文章

  • 如何使用 Scala 调度获取 301 重定向中返回的 URL?

    我正在使用斯卡拉dispatch http dispatch databinder net Dispatch htmlHTTP 库 版本 0 10 1 我向返回 HTTP 301 永久重定向的 URL 发出请求 例如 http wikipe
  • 自定义类上的 List.sum

    我有以下代表 GF2 字段的代码 trait GF2 def unary this def that GF2 GF2 def that GF2 GF2 def that GF2 that match case Zero gt throw n
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • scala.collection.Seq 不适用于 Java

    Using 阿帕奇火花2 0 1 Java 7 在 Apache Spark Java API 文档中 DataSet 类出现了一个example http spark apache org docs latest api java org
  • 带尖括号 (<>) 的方法

    方法名称中是否可以有尖括号 例如 class Foo ind1 Int ind2 Int var v new Foo 1 2 v 1 3 updates ind1 v lt 1 gt 4 updates ind2 真实情况显然比这更复杂 我
  • 在 Scala 中将 Map[String, String] 转换为 Map[String, Int]

    我有一个 Map 其中键是 String 值是 Int 但表示为 String scala gt val m Map a gt 1 b gt 2 c gt 3 m scala collection immutable Map String
  • 无法向 kafka 主题发送消息

    我正在使用 Kafka Play 以及 Scala 这是我的代码 我想在其中发送消息到kafka服务器 主题名称是 测试主题 尽管我没有在主题中看到我发送的消息 但我没有收到任何错误 这里有什么问题吗 import kafka produc
  • 如何在 Spark 中创建空数据帧

    我有一组基于 Avro 的配置单元表 我需要从中读取数据 由于Spark SQL使用hive serdes从HDFS读取数据 因此比直接读取HDFS慢很多 因此 我使用数据块 Spark Avro jar 从底层 HDFS 目录读取 Avr
  • Scala 中的多个类型下限

    我注意到tuple productIterator总是返回一个Iterator Any 想知道是否无法设置多个下限 因此它可能是最低公共超类型的迭代器 我尝试并搜索了一下 但只发现this https stackoverflow com q
  • 如何使用 Apache Livy 设置 Spark 配置属性?

    我不知道在向 Apache Livy 提交 Spark 作业时如何以编程方式传递 SparkSession 参数 这是测试 Spark 作业 class Test extends Job Int override def call jc J
  • scala 使用 GMPUtil 处理 pidigits

    Rex Kerr 发布了有关在 scala 中使用 GMP 的信息 特别是运行 pidigits 程序 libjpargmp so 使用 GmpUtil c 生成 我的问题是 在哪里可以找到 GMPUtil c 我的谷歌搜索没有发现任何东西
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Scala 中两个地图的交集和合并/连接

    假设我有两张类似这样的地图 val m1 Map 1 gt One 2 gt Two 3 gt Three val m2 Map 2 gt 2 0 3 gt 3 0 4 gt 4 0 我想根据键获取交集并返回一个表示合并值的元组 结果看起来
  • SBT - 运行任务来设置SettingKey

    所以我的一般问题是我想根据任务的结果设置版本密钥 但是版本密钥是在任务运行之前设置的 据我了解 一旦设置了键的值 我就无法更改它 因此我无法在我的任务中更改它 我想要做的是将任务作为发布任务的依赖项运行并更改版本的值 我觉得一定有办法做到这
  • 我们可以在比赛中重用后卫内部的中间变量吗?

    说我有方法foo as def foo i Int Option Int some code 现在我想在一个Seq of Int如下 Seq 1 2 map case int gt foo int collect case Some int
  • 对于值类型,asInstanceOf[X] 和 toX 之间有什么区别吗?

    我使用 IntelliJ 将 Java 代码转换为 Scala 代码的功能 通常效果很好 看来 IntelliJ 用调用替换了所有强制转换asInstanceOf 是否有任何有效的用法asInstanceOf Int asInstanceO
  • 如何从命令行运行scala文件?

    scala是否支持scala run xxx scala go语言支持这样运行 go my go 并且Python支持 python my py 但看来 scala xxx scala 仅进行语法检查 未观察到任何输出或运行行为 那么有没有
  • 在 case 语句中间使用 unapply 的对象

    scala gt object Test def unapply L R v L R Some v defined object Test scala gt 1 2 match case 1 Test 2 gt println First
  • 实现一个scala集合,以便map、filter等产生正确的类型

    我正在尝试实施一个默认值映射 https stackoverflow com questions 3187411 designing a convenient default valued map in scala 我想要过滤器 地图等De
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l

随机推荐

  • 如何安全地销毁 QThread?

    我想正确地销毁一个QThread在 Qt 5 3 中 到目前为止我已经得到 MyClass MyClass QObject parent QObject parent mThread new QThread this QObject con
  • 获取 3 个列表之间的差异

    我正在研究列表的差异 gt gt a 1 2 3 gt gt b 2 4 5 gt gt c 3 2 6 两组之间的对称差异可以使用以下方法完成 gt gt z set a symmetric difference set b gt gt
  • 3D 空间中的激光投影仪校准

    我正在研究一种在现实世界中校准激光投影仪的解决方案 该项目有几个目标 1 Take in a minimum of four points measured in the real world in 3d space that repres
  • dojo.parser.parse 仅在第一次调用时工作

    我有一个页面 当用户单击某些报告工具的链接时 它首先要求他们输入一些报告参数 我根据链接的 id 使用 AJAX 以表单形式获取参数对话框 每个对话框上都有一些 dojo 控件 因此我需要在对话框出现时解析它们 因为它最初不是页面的一部分
  • 可以在 Mathematica 中扩展 PDF、CDF、FindDistributionParameters 等功能吗?

    我开始使用新的 Mathematica 统计和数据分析功能进行越来越多的工作 我周二参加了 Mathematica 统计与数据分析 在线研讨会 非常棒的演讲 我强烈推荐 但我遇到了一些问题 我希望这个论坛上的人可以花点时间考虑一下 我创建了
  • VSO/VSTS:在主机代理上使用发布构建工件时出错

    使用 发布构建工件 任务时 构建中会引发以下错误 就在 获取源 之后 任务的定义没有与任何匹配的处理程序 由该代理支持 支持的处理程序 AzurePowerShell AzurePowerShellHandler PowerShell Po
  • 创建会话[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要在 php 中创建会话的帮助 我需要一个登录会话 然后如果用户想更改他们的用户名 他们可以但是 我知道如何更改用户名 但使用会话时情
  • 如何在 React App 完成加载之前显示全页加载器/旋转器

    如何制作全页加载器 旋转器 首先加载 然后显示 直到 React 或不同的基于 JS 的框架 应用程序完全加载 完全加载 是指浏览器旋转器停止旋转的那一刻 我正在为非 js 渲染的网站制作这些加载器 旋转器 但我不确定如何为 JS 渲染的应
  • Google 云端点(应用程序引擎)+ oauth2 与 android 集成

    我正在尝试将谷歌应用程序引擎云端点 API 与 android 集成 我已经按照此链接进行了相同的操作 无法使用我的服务对象连接到我的谷歌端点 https stackoverflow com questions 29544723 unabl
  • 你能强制 Vim 在文件末尾显示一个空行吗?

    当我在记事本中打开文本文件时 如果包含文本的最后一行末尾有回车符 则会显示一个空行 然而 在 Vim 中它不显示这个空行 我注意到的另一件事是 Vim 编辑器默认在最后一行添加回车符 即使它没有显示 我可以这么说 因为如果我在记事本中打开在
  • Java流合并或减少重复对象

    我需要通过将所有重复条目合并到一个对象中来从可以具有重复项的列表中生成一个唯一的朋友列表 Example 从不同的社交源中获取好友并放入 1 个大列表中1 朋友 姓名 约翰尼 德普 出生日期 1970 11 10 来源 FB fbAttri
  • 重新排序/重置自动增量主键

    我有一个带有自动增量主键的 MySQL 表 我删除了表格中间的一些行 例如 现在我在 ID 列中有这样的内容 12 13 14 19 20 我删除了 15 16 17 和 18 行 我想重新分配 重置 重新排序主键 以便具有连续性 即将 1
  • 如何在 mongodb 聚合期间有条件地投影字段

    我有一个用户文档 例如 id s0m3Id skills skill1 skill2 现在我想通过以下方式展开此文档 skills字段并为每项技能添加分数 所以我的汇总看起来像 unwind path skills preserveNull
  • Rest 服务器(Play Framework)在负载测试期间出现“Read Timed out”异常

    我们正在使用 Play Framework 在 REST 服务器上运行重负载测试 jmeter 350 个线程 35M 总请求 并在大约 2 小时后遇到以下错误 我们删除了其他组件 以便 request 只是接受请求而不执行任何操作 任何人
  • JSON 行 Mime 类型

    我想知道为 JSON 行设置什么 Content Type http jsonlines org http jsonlines org 我尝试搜索 它并不是真正的 application json 因为整个内容都不是 JSON 每一行都是
  • 如何从Python使用OpenCV的C++函数?

    我正在使用 OpenCV 的 Python 绑定 它真的很棒 但是 C 版本中的某些函数在 Python 绑定 BackgroundSubstractorMOG2 和许多特征检测算法中缺失 从 Python 调用它们的最简单方法是什么 我希
  • 在java中设置按钮点击延迟?

    我有一个保存按钮JFrame 单击 保存 时 保存 文本将设置为 正在保存 我需要在延迟 10 秒后将该文本设置为 已保存 在 java 中这怎么可能 请帮忙 try Thread sleep 4000 catch InterruptedE
  • 使用 Retrofit 2.0.x 进行 HTTP 缓存

    我正在尝试使用 Retrofit 2 0 在我的应用程序中缓存一些响应 但我遗漏了一些内容 我安装了一个缓存文件 如下 private static File httpCacheDir private static Cache cache
  • EF7(Core) 中同一个表的多个关系

    我有这样的模型 public class Question public string Id get set Guid NewGuid ToString public Answer Answer get set public List
  • 在 Scala 中的 List[Either] 上使用 flatMap

    Either从 Scala 2 12 开始是右偏的 这使得它可以在 for yield 块中使用 而无需投影 就像Option 但显然这还不足以表现得像Option当与flatMap object Main def main args Ar