F# 中元组的不完整模式匹配

2024-03-16

我定义一个点

type TimeSeriesPoint<'T> = 
    { Time : DateTimeOffset
      Value : 'T }

和一系列

type TimeSeries<'T> = TimeSeriesPoint<'T> list

我假设这个列表中的点是按时间排序的。

我正在尝试压缩两个时间序列,一般来说,它们会有相同时间的点,但它们中的任何一个都可能缺少一些点。

知道为什么我在下面的代码中收到不完整模式匹配的警告吗?

let zip (series1 : TimeSeries<float>) (series2 : TimeSeries<float>) =
    let rec loop revAcc ser1 ser2 =
       match ser1, ser2 with
       | [], _ | _, [] -> List.rev revAcc
       | hd1::tl1, hd2::tl2 when hd1.Time = hd2.Time ->
           loop ({ Time = hd1.Time; Value = (hd1.Value, hd2.Value) }::revAcc) tl1 tl2
       | hd1::tl1, hd2::tl2 when hd1.Time < hd2.Time ->
           loop revAcc tl1 ser2
       | hd1::tl1, hd2::tl2 when hd1.Time > hd2.Time ->
           loop revAcc ser1 tl2
    loop [] series1 series2

如果我这样写,我不会收到任何警告,但它是尾递归吗?

let zip' (series1 : TimeSeries<float>) (series2 : TimeSeries<float>) =
    let rec loop revAcc ser1 ser2 =
       match ser1, ser2 with
       | [], _ | _, [] -> List.rev revAcc
       | hd1::tl1, hd2::tl2 ->
           if hd1.Time = hd2.Time then
               loop ({ Time = hd1.Time; Value = (hd1.Value, hd2.Value) }::revAcc) tl1 tl2
           elif hd1.Time < hd2.Time then
               loop revAcc tl1 ser2
           else 
               loop revAcc ser1 tl2
    loop [] series1 series2

一般来说,这是一种反模式when守护在最后一个模式。

In zip,可以达到同样的效果zip'通过删除多余的保护来实现:

let zip (series1: TimeSeries<float>) (series2: TimeSeries<float>) =
    let rec loop revAcc ser1 ser2 =
       match ser1, ser2 with
       | [], _ | _, [] -> List.rev revAcc
       | hd1::tl1, hd2::tl2 when hd1.Time = hd2.Time ->
           loop ({ Time = hd1.Time; Value = (hd1.Value, hd2.Value) }::revAcc) tl1 tl2
       | hd1::tl1, hd2::tl2 when hd1.Time < hd2.Time ->
           loop revAcc tl1 ser2
       | hd1::tl1, hd2::tl2 ->
           loop revAcc ser1 tl2
    loop [] series1 series2

这两个函数都是尾递归的,因为递归调用后没有额外的工作loop.

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

F# 中元组的不完整模式匹配 的相关文章

  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 如何在 F# 列表和 F# 元组之间进行转换?

    有没有办法在 F List 和 F Tuple 之间进行转换 例如 1 2 3 gt 1 2 3 1 2 3 4 gt 1 2 3 4 我需要两个函数来做到这一点 let listToTuple list let tupleToList t
  • 对 null/空值使用 bool.Parse 时出错

    我有一个使用管道运算符的表达式 该表达式将值转换为字符串 然后转换为布尔值 但有时原始值可能为空 当值为 null 时 如何使用模式匹配或其他方式假设 false type kv Dictionary
  • Haskell 错误:“非详尽模式”

    所以我有这个功能 当我尝试像这样使用它时 合并排序列表 1 1 1 1 它给了我一个错误 1 1 例外 SortFunctions hs 86 1 91 89 非详尽 函数 mergeSortedLists 中的模式 85 mergeSor
  • java中使用[:punct:]函数的正则表达式

    我在用 punct 替换 a 中特殊字符的函数 字符串例如 REPLACE REGEXP REPLACE 第 1 列 punct 作为输出 作为java中SQL字符串的一部分 但我想要特定的特殊字符 不被替换 你能建议最好的方法吗 Acc
  • 绘图 Deedle 框架

    我有以下代码 let mychart frame GetAllSeries gt Seq iter fun key value gt Chart Line value Name key gt Chart Combine where fram
  • 如何搭建Windows Phone开发环境并使用F#开发应用程序?

    我已经下载了Windows Phone开发工具 但我不知道如何使用F 来开发应用程序 目前是C 将 F 和 Windows Phone 模板安装到 Visual Studio 中可以让生活变得更轻松 如果您打开 Visual Studio
  • 我缺少什么:可以使用多个参数进行函数组合吗?

    我了解 F 中函数组合的基础知识 例如所述here http blogs msdn com b chrsmith archive 2008 06 14 function composition aspx 不过 也许我错过了一些东西 这 gt
  • 独立于符号的字符串的模式匹配

    我需要一种算法 可以在数据中找到预定义的模式 以字符串的形式存在 独立于数据和模式的实际符号 字符 我只关心符号之间的关系 而不关心符号本身 数据中的同一符号具有不同的模式符号也是合法的 模式匹配算法必须强制执行的唯一一件事是保留模式中同一
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • F# 正确使用序列缓存

    我正在尝试将 Seq cache 与我制作的函数一起使用 该函数返回最多为 N 的素数序列 不包括数字 1 我无法弄清楚如何将缓存的序列保留在范围内 但仍然使用它在我的定义中 let rec primesNot1 n 2 n gt Seq
  • 当函数中的模式匹配采用 &self 或 &mut self 时,如何避免使用 ref 关键字?

    铁锈书称为ref关键词 遗产 https doc rust lang org book ch18 03 pattern syntax html legacy patterns ref and ref mut 因为我想遵循隐含的建议来避免re
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 从 F# 调用 Newtonsoft.Json 出现意外结果

    我没有从该 F 代码中获得预期结果 我希望 t 包含调用 JsonSchema Parse json 的结果 但它是空的 我究竟做错了什么 open Newtonsoft Json open Newtonsoft Json Schema l
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是

随机推荐

  • 从Android手机内存中读取文本文件

    我只想在手机内存中创建一个文本文件 并且必须读取其内容才能显示 现在我创建了一个文本文件 但它不存在于路径 data data package name file name txt 中并且它没有在模拟器上显示内容 我的代码是 public
  • 完整日历 - 拖放 - 自定义

    我正在使用 React 调度程序 FullCalendar 我喜欢保留拖放功能来将事件从一种资源更改为另一种资源 但是有没有办法禁止水平拖动来改变时间呢 同样现在 拖放的工作方式就像事件将从一个资源粘到另一个资源一样 并且没有平滑的拖动操作
  • 如何使用 jQuery UI 调整 datatables.js 列的大小

    我在 stackoverflow 中找到了调整表列大小的解决方案 jQuery UI 使用表格和 colspan 调整大小 https stackoverflow com questions 18812432 jquery ui resiz
  • 图实现C++

    我想知道如何用 C 快速编写图的实现 我需要数据结构易于操作和使用图算法 例如 BFS DFS Kruskal Dijkstra 我需要这个实现来参加算法奥林匹克竞赛 因此编写数据结构越容易越好 你能建议这样的DS 主要结构或类以及其中的内
  • 找不到满足 torch>=1.0.0 要求的版本?

    找不到满足要求的版本 torch gt 1 0 0 找不到 torch gt 1 0 0 的匹配发行版 来自 stanfordnlp 如果您的 Python 版本太新 也可能会发生这种情况 目前使用 Pytorch不支持3 7 9以上版本
  • InvalidDataAccessApiUsageException:执行更新/删除查询 Spring XML 到 Java 配置

    我正在尝试将 spring xml 配置转换为 java 配置 通过 XML 配置可以完美地实现这一点 但是 如果我使用 java 配置初始值设定项 它会引发以下异常 当它尝试运行 JQL 时会发生这种情况 但应用程序正常启动 所有 JPA
  • CocoaPods 错误:RPC 失败; curl 18 传输已关闭,剩余未完成的读取数据

    当我尝试使用 CocoaPods 导入 Realm 时 如下所示 pod install verbose no repo update 然后发生错误 error RPC failed curl 18 transfer closed with
  • 引用c++中的引用

    我正在研究 C 中的参考概念 并且我对 C 完整参考中的这个陈述有点困惑 您不能引用其他引用 那么在这种情况下发生了什么 int var 10 int ref var int r ref ref r ref cout lt lt var l
  • 返回两个圆之间的 x,y 交点的 JavaScript 函数?

    我得到了两个圆的 x y 中心位置及其半径 但我需要使用 JavaScript 找到它们的交点 用红色标记 我认为就数学而言最好的解释已经找到here http paulbourke net geometry circlesphere 两个
  • LEFT OUTER JOIN SUM 双倍问题

    表 购物 shop id shop name shop time 1 Brian 40 2 Brian 31 3 Tom 20 4 Brian 30 表 香蕉 banana id banana amount banana person 1
  • 在数组第三维上应用函数

    我有一个大数组 这是一个可复制的示例 cube lt array c 1 10 5 15 5 5 1 18 c 4 4 3 cube 1 1 2 3 4 1 1 5 9 7 2 2 6 10 8 3 3 7 5 9 4 4 8 6 10 2
  • 添加条目到task_struct并初始化为默认值

    我想添加一个条目到进程控制块结构 task struct 让我们说一种标记某些进程的方法 我想将除 一些特殊进程 之外的所有进程的该字段初始化为 0 稍后通过调用sched setscheduler 我将为 特殊进程 设置此标志 有谁知道如
  • 使用 RequireJS(和 Jasmine/Sinon)时如何在另一个视图渲染方法中存根 Backbone View 实例化

    我正在尝试使用 Jasmine 和 Sion 编写单元测试 但在使用 RequireJs 加载模块时 我很难找到与以下内容等效的内容 sinon stub window MyItemView 使用 RequireJs 时 我无法以这种方式存
  • Google Maps Android API v2,标记标题/片段显示错误

    我使用 Google Maps Android API v2 与 Android 来显示当前位置和附近的标记 使用 Google Places API 接收附近地点的位置和标题 问题是标题 片段中的非英文名称显示失败 例如 希伯来语名字 附
  • 让 ipython 在我按回车键时始终执行命令?

    迁移到 ipython 后 我注意到有时 return 键会导致换行而不是执行命令 例如 如果我的光标之前 in print 这会导致 print 我怎样才能让它运行print 在这种情况和其他情况下 当您处于多行模式时会发生这种情况 例如
  • Google 图表嵌入 API 无法正常工作

    我正在使用 Embed API 从 ServiceAccount 在我的网站上包含 GA 图表 该网站是一个使用 AngularJS 的单页应用程序 我为每种图表类型和控制器创建了多个指令 将其命名GAController 在他们之间共享
  • Pyspark 将结构数组转换为字符串

    我在 Pyspark 中有以下数据框 name subject score Tom math 90 Tom physics 70 Amy math 95 I used collect list and struct函数来自pyspark s
  • C++ 错误:转换为非标量类型 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我似乎在以
  • JavaFX HMTLEditor 对“返回”键没有反应

    我试图用 JavaFX 做一些实验HTMLEditor成分 我使用了以下代码 摘录 fxPanel new JFXPanel Platform runLater new Runnable Override public void run G
  • F# 中元组的不完整模式匹配

    我定义一个点 type TimeSeriesPoint lt T gt Time DateTimeOffset Value T 和一系列 type TimeSeries lt T gt TimeSeriesPoint lt T gt lis