F# 中的自定义 IEnumerator

2024-03-14

更多 F# 问题。我在下面实现了二进制阅读器。我希望它像可枚举序列一样工作。下面的代码给了我以下错误,我像往常一样不知道如何解决它。我有一个 C# 实现,我必须实现两个不同的覆盖.Current财产。我想我必须在这里做同样的事情,但不知道如何做。一如既往,提前一百万感谢您的帮助。

错误 FS0366:没有给出任何实现Collections.IEnumerator.get_Current() : obj。请注意,所有接口成员都必须实现并在适当的目录下列出interface声明,例如interface ... with member ....

namespace persisitence
open System.Collections.Generic
open System
open System.IO
type BinaryPersistenceIn<'T>(fn: string, serializer: ('T * BinaryReader) -> unit) as this =
    let stream_ = File.Open(fn, FileMode.Open, FileAccess.Read)
    let reader_ = new BinaryReader(stream_)
    [<DefaultValue>] val mutable current_ : 'T

    let eof() =
         stream_.Position = stream_.Length


    interface IEnumerator<'T> with

        member this.MoveNext() = 
            let mutable ret = eof()

            if stream_.CanRead && ret then
                serializer(this.current_, reader_)

            ret

        member this.Current
            with get() = this.current_ 

        member this.Dispose() =
            stream_.Close()
            reader_.Close()

        member this.Reset() = 
            stream_.Seek((int64) 0., SeekOrigin.Begin) |> ignore

正如@Richard 指出的,你需要实现IEnumerator.Current.
这是回答您的问题“如何做”的代码。这应该有效:

一些注释:(感谢@DaxFohl)

  • IEnumerator位于不同的命名空间中(参见代码)。
  • MoveNext and Reset确实是以下成员IEnumerator, not IEnumerator<'t>,所以这就是它们应该被实施的地方。
  • Dispose,然而,是在IEnumerator<'t>(惊喜! :-)

-

type BinaryPersistenceIn<'T>(fn: string, serializer: ('T * BinaryReader) -> unit) as this =
    ...    

    interface IEnumerator<'T> with
        ...
        member this.Current
            with get() = this.current_ 

    interface System.Collections.IEnumerator with
        member this.Current
            with get() = this.current_ :> obj
        member this.MoveNext() = ...
        member this.Reset() = ...

最后,我必须补充一点:你真的吗?sure你想实施IEnumerator?这是一个相当低级的事情,很容易出错。为什么不使用序列计算表达式来代替呢?

let binaryPersistenceSeq (fn: string) (serializer: BinaryReader -> 'T) = 
  seq {
    use stream_ = File.Open(fn, FileMode.Open, FileAccess.Read)
    use reader_ = new BinaryReader(stream_)

    let eof() = stream_.Position = stream_.Length

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

F# 中的自定义 IEnumerator 的相关文章

  • F# 图表示例

    我想使用内置功能或免费库在 F 中做一些基本的图表 我会对一个非常基本的例子感到非常非常满意 如果可能的话 饼图 示例数据 John 34 Sara 30 Will 20 Maria 16 其中整数是饼图中要表示的百分比 我最近安装了 VS
  • 从传递给 C# 的 F# 列表中检索项目

    我在 C 中有一个在 F 中调用的函数 将其参数传递到Microsoft FSharp Collections List 如何从 C 函数中的 F 列表中获取项目 EDIT 我找到了一种 函数式 风格的方式来循环它们 并且可以将它们传递给如
  • 实现领域驱动设计的函数式方法

    我在使用 C 编写领域驱动应用程序方面拥有丰富的经验 我编写的应用程序越多 我就越发现我想要采用一种不太适合标准 C OO 技术的方法 我想编写尽可能多的纯函数 因为它们真的很容易测试 我想以更具声明性的方式编写我的业务逻辑 所以我一直在研
  • 对 F# 联合类型列表进行操作

    这是我的问题的延续F 联合类型列表 https stackoverflow com questions 13770911 f list of union types 感谢有用的反馈 我能够创建一个列表Reports with Report要
  • Silverlight 如何确定程序集是“Silverlight”?

    我正在尝试从 F 编译代码以在 Silverlight 中使用 我编译 noframework cliroot C program Files Microsoft Silverlight 2 0 31005 0 standalone 这会生
  • .NET 4 自旋锁

    以下测试代码 F 未返回我期望的结果 let safeCount let n 1000000 let counter ref 0 let spinlock ref lt SpinLock false let run i0 i1 for i
  • Scala REPL 中的类型信息

    如果我使用 F 解释器 我可以定义一个简单的函数 如下所示 gt Function to check if x is an integer multiple of y gt let multipleOf x y x y 0 val mult
  • 在 F# 中的 Choice 之上构建 Either(或 Result)

    我根据 Scott Wlaschin 中的信息构建了一个成功 失败的 monadblog http fsharpforfunandprofit com posts computation expressions wrapper types
  • 如何在插件场景中实现程序集绑定重定向?

    我有一个plugin P延伸和application A NET40 我无法控制 P 程序集 NET40 有一个shared dependency D NET35 P和D都依赖于FSharp Core 但版本不同 P是针对FSharp Co
  • 在 IEnumerable 上使用 Seq 函数 [重复]

    这个问题在这里已经有答案了 我正在尝试在 IEnumerable 上应用 Seq 函数 更具体地说 它是System Windows Forms HtmlElementCollection它实现了ICollection and IEnume
  • 如何在 F# 中捕获任何异常(System.Exception)而不发出警告?

    我试图捕获异常 但编译器给出警告 此类型测试或向下转型将始终保持 let testFail try printfn Ready for failing failwith Fails with System ArgumentException
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • F# 中的数组初始化

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

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https

随机推荐

  • 使用 Android TV 应用程序的遥控器

    我正在开发 Android 电视应用程序 当我尝试在真正的 Android TV 中测试它时 我无法使用遥控器按钮导航到任何按钮或任何内容 上下左右 我搜索过它 发现我必须使用 启用方向键导航 但我不知道如何使用它 我没有找到任何代码或教程
  • 检查 PyTorch 张量在 epsilon 内是否相等

    如何检查两个 PyTorch 张量在语义上是否相等 考虑到浮点错误 我想知道元素是否仅相差一个小的 epsilon 值 在撰写本文时 这是最新稳定版本 0 4 1 中的一个未记录的函数 但文档位于master unstable branch
  • ant 未被识别为内部或外部命令

    我运行的是带有 Service Pack 3 的 Windows XP Professional 版本 5 1 我已经下载了 JDK 1 6 0 24 b07 并测试了它是否有效 我下载了 apache ant zip 并将其安装到 C a
  • 通过 EWS 和 C# 访问没有邮箱的资源日历

    我们的 Exchange 管理员 Exchange 2010 SP1 设置了共享资源日历 没有分配给该资源日历的邮箱 我希望能够使用 EWS 和 C 阅读会议 Snippet ExchangeService esvc new Exchang
  • 在 Lithium 中调用 MySQL 函数

    如何调用 MySQL 函数 例如GeomFromText or 选择为 在里面锂框架 http www lithify me 增删改查 使用数据库 gt 读取 很不方便 我经常更改数据库列 并且将函数包含在变量的值中只会最终被转义 您是否尝
  • 如何在weblogic.xml中设置X-POWERED-BY?

    这里声明可以设置 X POWERED BY 标头外观 但我看不出有什么方法可以通过weblogic xml 有人知道怎么做吗 一般来说 这些属性可以在集群级别被覆盖 在 ClusterMBean 中 如果那里存在相同的属性 服务器 leve
  • 错误:跳转到标签“foo”与“bar”的初始化交叉

    以下 C 示例无法使用 gcc 或 clang 进行编译 但仅会使用 ICC 生成警告 而使用 MSVC 则不会生成任何警告 int main int argc char argv if argc lt 2 goto clean up if
  • 无法通过 ssms 连接到 azure sql

    我正在尝试通过 SQL Server 2008 R2 SP2 连接 Azure 的 SQL 数据库 我正在使用 Azure 并免费试用订阅 我已经到处搜索并尝试过这些事情 在 Windows 防火墙中允许端口 1433 的入站和出站规则 检
  • Python 3 没有 IDLE 吗?

    我昨天在我的 Windows Vista PC 上安装了 Python 3 1 并惊讶地发现 IDLE 的版本是 2 6 4 即 Python 2 6 4 r264 75708 Oct 26 2009 08 23 19 MSC v 1500
  • 使用 UnboundId api 查看 LDAP 中修改的条目

    这是我想要查看 LDAP 中已在 LDAP 服务器端修改的修改条目的要求 Unboundid API 中是否有任何 API 或代码 以便我可以查看 LDAP 中修改的条目 尽管您的问题不太清楚 但我认为您是在问是否有一种方法可以检测目录服务
  • Tkinter 使用鼠标在 Canvas 上调整矩形大小

    我想在 Tkinter 中为我的研究项目创建一个简单的 GUI 图像标签工具 目前 我有可以从目录加载图像并允许我绘制多个边界框的工作代码 我想修改代码 以便在单击矩形 BB 时可以使用鼠标调整它的大小 我在网上搜索过 但找不到任何资源可以
  • 通过将变量名称“缝合”在一起来访问 C++ 中的变量

    假设我有一个变量 int fish5 7 我可以通过连接术语 fish 和 5 来访问fish5吗 理想的解决方案如下所示 printf I am displaying the number seven i fish 5 不 不完全是你想要
  • 将 CSV 文件导入 Django 模型的最简单方法是什么?

    我正在 DJANGO 中制作一个应用程序来处理很多 问题 模型中指定了一个问题表 或多或少会有数千个问题 现在 我手头有一个 Excel 文件 其中包含所有问题 我可以从那里创建一个 CSV 文件 我只需要获取问题表中的 CSV 数据 最简
  • 使用 ProducerTemplate 通过 Camel 进行代理身份验证

    我有一个使用 Camel 并在 ServiceMix 服务器上运行的项目 但我似乎无法让它访问外部 Web 服务 我怀疑这是因为我无法正确设置代理身份验证 Exchange exchange producerTemplate request
  • 如何使用@SpringBootApplication注解自动检测@ConfigurationProperties注解的类

    我正在学习 Spring Boot 并对参考文档中的一个示例有疑问 以下部分文档 https docs spring io spring boot docs current reference html using spring boot
  • 如何在 Google Drive API 中获取修订的导出链接

    我正在使用 Google Apps 脚本来尝试获取 Google 绘图的各种修订版的导出链接列表 下面的代码重现了该问题 要尝试一下 请使用绘图的 ID 调用 getRevisionHx Google oAuth function goog
  • 更新到 Xcode 8.3 后,桥接标头中出现“文件“File.h”的不可移植路径;指定路径与磁盘上的文件名不同”警告

    我更新到 Xcode 8 3 和 Swift 3 1 并在桥接头文件中收到此警告 引用了 Objective C 头文件 文件 File h 的不可移植路径 指定的路径与磁盘上的文件名不同 我该如何解决这个问题 原来我拼错了文件名 正确的名
  • 仍然建议使用 Minitest 测试 Rails 4 中的路由吗?

    在 Rails 3 中 当在 MiniTest 中编写功能测试时 我养成了分别测试路由和测试控制器操作的习惯 我的想法来自于Rails 测试指南 第 9 节 测试路线 http guides rubyonrails org testing
  • 如何将 JSON 转换为 CSV?

    我该如何修复该错误 http play golang org p 0UMnUZOUHw http play golang org p 0UMnUZOUHw JSON to CSV in Golang package main import
  • F# 中的自定义 IEnumerator

    更多 F 问题 我在下面实现了二进制阅读器 我希望它像可枚举序列一样工作 下面的代码给了我以下错误 我像往常一样不知道如何解决它 我有一个 C 实现 我必须实现两个不同的覆盖 Current财产 我想我必须在这里做同样的事情 但不知道如何做