Scala:基于类型的列表分区

2023-12-08

我有这段代码想要改进:

sealed abstract class A
case class B() extends A
case class C() extends A
case class D() extends A

case class Foo[+T <: A](a: T)

/** Puts instances that match Foo(B()) in the first list and everything else,
  * i.e. Foo(C()) and Foo(D()), in the second list. */
def partition(foos: List[Foo[_ <: A]]): (List[Foo[B]], List[Foo[_ <: A]]) = {
  // ...
}

我想在以下几个方面改进这一点:

  1. 我可以改变吗partition的返回类型,因此它表明没有Foo[B]在第二个列表中?
  2. 我可以摆脱吗Foo的类型参数T(即改变Foo to case class Foo(a: A))并仍然声明partition具有相同类型的保证? (显然,它必须返回与(List[Foo], List[Foo]).)

P.S.:请告诉我“无形”标签是否与此问题无关。


由于 Scala 的混合方式,这个问题有点棘手代数数据类型(像你的A)和子类型。在大多数带有 ADT 的语言中,B, C, and D根本不是类型——它们只是“构造函数”(某种意义上类似于 OOP 构造函数,但不一样)。

谈论一个没有意义Foo[B]在这些语言(如 Haskell 或 OCaml)中,但在 Scala 中可以,因为 Scala 将 ADT 实现为扩展基本特征或类的案例类(和类对象)。那并不意味着你should到处谈论Foo[B]不过,一般来说,如果您想用 FP 术语进行思考并使用类型系统来发挥自己的优势,那么最好不要这样做。

回答您的具体问题:

  1. 不,实际上不是以任何方便的方式。您可以使用标记的联合(带有Either[Foo[C], Foo[D]]元素)或类似 Shapeless 的东西Coproduct(一个列表Foo[C] :+: Foo[D] :+: CNilelements) 来表示“一系列事物类型A, 但不是B”,但这两种方法都是相当笨重的机械,对于一开始可能不是最好的想法的东西来说。
  2. 我建议不要参数化Foo在子类型上A,但是如果你想能够代表“aFoo其中包含一个B“在类型级别,您将需要保持当前的方法。

解决你的后记:如果你想概括 ADT,Shapeless 绝对适用 - 请参阅我的博客文章here例如,关于按构造函数进行分区。如果你这样做只是为了A不过,Shapeless 可能不会给你带来太多好处。


作为脚注,如果我确实需要一个分区操作来分割类型的元素Foo[B],我可能会这样写:

def partition(foos: List[Foo[A]]): (List[Foo[B]], List[Foo[A]]) =
  foos.foldRight((List.empty[Foo[B]], List.empty[Foo[A]])) {
    case (Foo(B()), (bs, others)) => (Foo(B()) :: bs, others)
    case (other, (bs, others)) => (bs, other :: others)
  }

这并不理想——如果我们真的想要一个List[Foo[B]],如果有一个就好了List[Foo[~B]]代表剩菜——但这还不错。

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

Scala:基于类型的列表分区 的相关文章

  • 通过 Gradle 进行测试时记录日志

    在测试时 Gradle 似乎将 stdout stderr 重定向到project dir build reports tests index html 有没有办法避免这种重定向 并将内容打印到控制台 附加信息 这是一个 Scala 2 9
  • 如何在 TS 中使用泛型谓词

    我想使用数组过滤谓词函数 e g const isNotEmptyName
  • 为什么“private val”和“private Final val”不同?

    我曾经以为private val and private final val是一样的 直到我看到 Scala Reference 中的第 4 1 节 常量值定义的形式为 final val x e 其中 e 是常量表达式 第 6 24 节
  • 写入 Delta 表时检测到架构不匹配 - Azure Databricks

    我尝试将 small radio json json 加载到 Delta Lake 表 在此代码之后我将创建表 我尝试创建 Delta 表 但收到错误 写入 Delta 表时检测到架构不匹配 可能与分区有关events write form
  • Either 相当于受检查的异常吗?

    从 Scala 开始并阅读有关Either我很自然地将新概念与我所知道的东西 在本例中来自 Java 进行比较 与之前有什么区别吗concept检查异常和Either 在这两种情况下 失败的可能性在方法中明确注释 throws或返回Eith
  • Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

    我正在尝试使用 scalaz iteratee 包在恒定空间中处理大型 zip 文件 我需要对 zip 文件中的每个文件执行一个长时间运行的进程 这些进程可以 并且应该 并行运行 我创建了一个EnumeratorT使每个膨胀ZipEntry
  • 如何从 Scala repl 中取消导入隐式?

    是否可以从 repl 中取消导入隐式内容 说我做这样的事情 scala gt import scala math BigInt import scala math BigInt scala gt implicits 2 implicit m
  • 将无形状 HList 转换为 TupleN,其中元组形状不需要与 HList 形状完全匹配

    我想创建相当于 def toTupleN A1 AN L lt HList l L TupleN A1 AN 代码使用toTupleN仅当恰好有一个时才应该编译N中的值的组合l可以从中创建元组 其他任何内容都应该生成编译时错误 应考虑可用的
  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • IntelliJ IDEA Scala 插件问题

    我对新的 Intellij IDEA 10 和 Scala 插件有疑问 当我在 Scala 源文件中输入任何内容时 编辑器会永久冻结 在其他文件 java 和其他 编辑器中效果很好 结构视图 scala 检查和显示成员功能已关闭 堆大小增加
  • Liftweb 环境中的后台任务

    我必须编写守护进程 并且我想使用模型来连接到数据库和一些有用的 Lift 类 是否可以运行 Rails 的 rake 任务的模拟 Scala 社区组上也有类似的问题 答案是使用Actors来做后台处理
  • Scala 性能问题

    In the 丹尼尔 科泽夸 Daniel Korzekwa 撰写的文章 http blog danmachine com 2011 01 moving from java to scala one year html 他说以下代码的性能
  • 为什么使用非十进制数据类型不划算?

    tl dr 我的怎么了Cur 货币 结构 tl dr 2 在给出示例之前 请先阅读问题的其余部分float or double 我知道这个问题在互联网上已经出现过很多次了 但是我还没有看到令人信服的答案 所以我想我会再问一次 我无法理解为什
  • Scala - 如何解决“值不是 Nothing 的成员”错误

    此示例代码基于 Atmosphere 类 但如果有人可以让我了解该错误的一般含义 我想我可以找出任何特定于 Atmosphere 的解决方案 val bc BroadcasterFactory getDefault lookup broad
  • 将 Scala 库转换为 DLL (.NET)

    我正在尝试从 scala 类创建一个 Dll 我将 IntelliJ 与 SBT 一起使用 我已经找到了一种使用 ikvm converter 将 jar 文件转换为 Dll 的方法 现在的问题是 当我在 SBT 下使用 package 从
  • Scala 中值类的隐式 Json 格式化程序

    我有许多值类组成了一个更大的对象案例类 final case class TopLevel foo Foo bar Bar final case class Foo foo String extends AnyVal final case
  • 最小重复子串

    我正在看 Perl代码高尔夫页面 http www perlmonks org node id 82878 不要问为什么 并遇到了这个 第 3 洞 最小重复图案 编写一个子例程 它接受一个字符串 该字符串可能包含 重复模式 并返回最小的重复
  • 如何抑制spark输出控制台中的“Stage 2===>”?

    我有数据帧并试图获取不同的计数并且能够成功获取不同的计数 但是每当 scala 程序执行时我都会收到此消息 Stage 2 gt 1 1 2 我如何在控制台中抑制特定的此消息 val countID dataDF select substr
  • 如何从 SparkSQL DataFrame 中的 MapType 列获取键和值

    我的镶木地板文件中有数据 该文件有 2 个字段 object id String and alpha Map lt gt 它被读入 SparkSQL 中的数据帧 其架构如下所示 scala gt alphaDF printSchema ro
  • Scala:类似 Option (Some, None) 但具有三种状态:Some、None、Unknown

    我需要返回值 当有人询问值时 告诉他们以下三件事之一 这是值 没有价值 我们没有关于该值的信息 未知 情况 2 与情况 3 略有不同 示例 val radio car radioType 我们知道该值 返回无线电类型 例如 pioneer

随机推荐

  • 如何使用 awk 或 sed 递归查找/替换字符串?

    如何查找并替换每次出现的情况 subdomainA example com with subdomainB example com 在每个文本文件中 home www 目录树递归 find home www type d name git
  • Xcode 退出时找不到 Parse/Parse.h 文件

    我在我的项目中添加了 Parse SDK 一切都很好 然而 当我退出 Xcode 并打开项目时 我收到以下错误 Parse Parse h file not found 我删除了 Parse Framework 并将其重新添加到我的项目中
  • 使用委托或 lambda 封装秒表计时?

    我正在编写这样的代码 做了一些快速而肮脏的计时 var sw new Stopwatch sw Start for int i 0 i lt 1000 i b DoStuff s sw Stop Console WriteLine sw E
  • 将字节存储到寄存器 x86-64 程序集中的问题

    我正在尝试编写一个函数来确定作为第一个参数给出的字符串的长度 因此 rdi 将包含 char ptr 当我打电话时movb rdi rcx将 rdi 指向的字符移动到 rcx 中 出现以下错误 incorrect register rdx
  • Android MediaRecorder Video - 随后播放音频和视频轨道

    我遇到了一个错误 主要出现在三星设备上 我用媒体记录器录制视频 代码如下所示 它在所有设备上都能完美运行 但现在在某些 Android 设备上 音频和视频轨道是分开的 假设我正在捕捉 5 秒的视频 视频时长为 5 秒 播放视频将播放视频的第
  • 使用ajax发送base64图像

    我正在尝试从画布中生成图像 并通过 ajax 发出的 POST 请求将其发送到服务器 我正在使用 html2canvas 将 div 转换为 canvas 并使用 toDataURL 将其转换为 base64 这是我的JS function
  • 如何在 XPath 中使用 AND 运算符?

    XML 就像 a b value1 b b value2 b a 我想写 XPath 来查找 id a 那里会有两个 b 具有固定值的子节点value1 and value2 我试图找出 XPath 的条件如下 xml gt xpath b
  • 在 Objective-C 中如何在视图控制器之间传递对象?

    我花了两天时间艰难地研究一些代码 试图找出为什么我无法获取我在 h 中声明并在 m 中实现并在 viewDidLoad 函数中设置的全局 NSMutableArray 变量 我终于明白了 Objective C 中不存在全局变量这样的东西
  • 横向启动应用程序会导致启动时旋转

    我已经实现了shouldAutorotateToInterfaceOrientation 并且在我的应用程序运行后 在条款或方向更改方面一切正常 但是 我不喜欢我的应用程序首次启动时的行为 当我以纵向启动我的应用程序时 它会按预期打开 但是
  • 如何确定 Android 中的语音信箱电话号码

    如何在 Android 代码中确定手机的语音信箱号码 您可以在 TelephonyManager 类中使用 getVoiceMailNumber 请注意 这可能不适用于所有手机提供商 Android 电话管理器
  • 如何将 .dds 文件加载到图片框中?

    如何在 C 中将 dds 纹理文件加载为图像 我在谷歌上找不到任何有用的东西 你给我的信息和样本越多 我就越能理解它 我遇到过同样的问题 这是一个很好的解决方案 Source http www mastropaolo com devildo
  • Azure 数据工厂:事件未启动管道

    我已经设置了一个包含复制活动的 Azure 数据工厂管道 出于测试目的 源和接收器都是 Azure Blob 存储 我不想在源 Azure Blob 存储上创建新文件后立即执行管道 我创建了 BlovEventsTrigger 类型的触发器
  • 类型 Set 不带参数

    package set import java util public class Set public static void main String args String things appple bob ham bob bacon
  • 使用 decltype() 和三元运算符有条件地选择类型

    我有一个文件a cpp include
  • 使用 C# 在 WebDriver 中打开新窗口

    EDIT 4 EDIT 3 EDIT 2 string currentWindow driver CurrentWindowHandle driver SwitchTo Window string childTitle driver Tit
  • .py 和 .pyc 文件有什么区别? [复制]

    这个问题在这里已经有答案了 我注意到了 pyc当某些情况下会自发生成文件 py运行同名文件 有什么区别 py and pyc files 另外 我发现有 pyc周围的文件使空间变得混乱 是否应该删除 pyc文件 或者让它们存在有什么好处和
  • Python3 表情符号字符作为 unicode

    我在 python3 中有一个字符串 其中包含表情符号 我想将表情符号视为它们的 unicode 表示形式 我需要对这种格式的表情符号进行一些操作 s hello 这将每个表情符号视为自己的角色 这样len s 9 s 0 我想更改字符串的
  • 如何使用子字符串分割字符串

    我有一个像 Test1 Test2 这样的字符串 我需要将 Test2 与它分开 我怎样才能在 C 中做到这一点 尝试这个 string toSplit Test1 Test2 toSplit Split or toSplit Split
  • Android:当我动态添加新的 ListView 条目时,ListView 中的微调器会丢失其值

    我的活动包含一个按钮和一个列表视图 ListView 包含一个 Spinner 视图和一个 EditText 视图 每次我想在 Activity 的 ListView 中插入新行条目时 我都会使用该按钮 我按照以前的 stackoverfl
  • Scala:基于类型的列表分区

    我有这段代码想要改进 sealed abstract class A case class B extends A case class C extends A case class D extends A case class Foo T