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# 中元组的不完整模式匹配 的相关文章

  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 使用 System.Text.Json 序列化记录成员

    我在记录中使用自我引用成员 如下所示 type Payload Id Guid member x DerivedProperty Derived Property using id x Id NewtonSoft Json会序列化这个 但是
  • 在构建过程中引用自身内部的记录

    我正在尝试创建一条记录 该记录在同一构造函数中使用先前定义的字段之一来计算另一个字段的值 例如 myRecordType Foo int Bar int myRecord Foo 5 Bar Array init Foo fun i gt
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f
  • Elixir:模式匹配对于元组和映射的工作方式不同

    在 Elixir 中 如果我尝试模式匹配以下两个元组 a 1 2 我收到匹配错误 但如果我对两张地图做同样的事情 x a x 1 y 2 它工作正常 并且a绑定到 1 我可以明白为什么匹配两个元组会出错 但为什么匹配映射不会出错 在第一个示
  • Scala 中的模式匹配是如何在字节码级别实现的?

    Scala 中的模式匹配是如何在字节码级别实现的 是不是像一系列if x instanceof Foo 构造 还是其他什么 它对性能有何影响 例如 给出以下代码 来自Scala 示例 http www scala lang org docu
  • 线性模式匹配算法?

    我有一个由 0 和 1 组成的线性列表 我需要匹配多个简单模式并找到第一个出现的情况 例如 我可能需要找到0001101101 01010100100 OR 10100100010长度为 800 万的列表内 我只需要找到第一次出现的情况 然
  • 专家 f# 脚本编译奇怪

    第 209 210 页有一个扩展示例 见下文 我使用的是 F 4 5 总之 我不明白的是 如果我单独键入每个语句 则会有一个声明引发错误 如果我立即提交整个脚本 以及引发错误的声明之后的函数 则一切正常 那么 当我批量提交所有语句时 交互中
  • 您将如何在 F# 中解决这个问题? (高频传感器数据)

    我是一名机械工程研究生 我的导师刚刚要求我为我们的一个传感器项目编写一个数据可视化实用程序 由于现在是夏天 他希望我能从中获得一些乐趣 我认为这将是学习一门擅长科学计算的语言的好时机 所以我直接开始学习 F 由于我是函数式编程范例的新手 因
  • Clojure 尾递归与质因数

    我正在尝试自学 clojure 并使用 Prime Factors Kata 和 TDD 的原则来实现这一目标 通过一系列 Midje 测试 如下所示 fact primefactors 1 gt list fact primefactor
  • 使用 Cuda 并行读取多个文本文件

    我想使用 CUDA 在多个文件中并行搜索给定字符串 我计划使用 pfac 库来搜索给定的字符串 问题是如何并行访问多个文件 示例 我们有一个包含 1000 个文件的文件夹 需要搜索 这里的问题是我应该如何访问给定文件夹中的多个文件 应该动态
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • 使用列表匹配绑定值(没有编译器警告)

    假设我有一个需要一些时间的函数int参数 但在其中我将使用float32 我不想使用float32 i无处不在的功能 相反 我想这样做 let x float32 x let y float32 y let w float32 w let
  • 在构建服务器上安装 F# 4.1 SDK

    我已在 PC 上安装了支持 F 的 Visual Studio 2017 并且 MSBuild 目标位于C Program Files x86 Microsoft Visual Studio 2017 Enterprise MSBuild
  • 我应该强制使用 F# 测量单位的类型吗? [风格与一般性]

    这个问题与 F 相关计量单位 https learn microsoft com en us dotnet fsharp language reference units of measure 我应该为我正在使用的单元强制执行类型吗 例如
  • 已知最有效的尾递归素数验证函数是什么?

    到目前为止 我正在尝试元编程 compiled on Ubuntu 13 04 with clang O3 ftemplate depth 8192 fconstexpr depth 4096 std c 11 stdlib libc lc
  • Rust 模式匹配如何确定绑定变量是引用还是值?

    use crate List Cons Nil derive Debug struct Foo derive Debug enum List Cons i32 Foo Nil impl List fn tail self gt Option
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int

随机推荐

  • 从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