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 的相关文章

  • 作为参数的函数的类型推断

    我想编写一个函数 它接受几个元组作为参数 并用元素选择它们并传递给另一个函数 其中 i 作为另一个参数给出 我已经尝试过这样的事情 let function tup1 A A tup2 B B i otherFunction i tup1
  • F# 的 timeit 函数

    我想写一些类似的东西 let timeit x a gt b let start System DateTime Now x let duration System DateTime Now start printfn time usage
  • 使用实体框架代码优先的 FSharp 记录类型

    我正在一个业务应用程序中进行概念验证 我想用 F 替换当前的 C 代码优先实体框架实现 我正在关注this http blogs msdn com b visualstudio archive 2011 04 04 f code first
  • 使用 F# 3.0 进行动态 SQL 查询?

    我尝试过使用 FLINQ 但它对于 F 3 0 beta 来说已经过时了 有人可以指导我如何在 F 中创建动态 SQL 查询吗 我们最近开发了一个库 FSharpComposableQuery 旨在支持 F 3 0 及以上版本中更灵活的查询
  • F# 类型函数和 [] 属性

    这两个 F 类型函数有什么区别 let defaultInstance1 lt a when a new unit gt a gt new a
  • 从 F# 中存储为概率序列的离散分布函数中抽取随机数

    存在给定的有限长度 N 的浮点序列 介于 0 和 1 之间 表示整数 0 N 1 上的分布函数 我们试图从这个分布中抽取一个随机数 一种方法是在 0 1 浮点数 中绘制一个均匀随机变量 然后计算该数字的逆累积分布函数 如果分布在数组中 则代
  • 对象中的公共可变字段

    是否可以在 F 中创建一个简单的公共可变字段 我正在创建一个将从 C 程序访问的库 并且我需要能够从 C 设置一个字段 C Equivalent public class MyObj public int myVariable F type
  • Silverlight 如何确定程序集是“Silverlight”?

    我正在尝试从 F 编译代码以在 Silverlight 中使用 我编译 noframework cliroot C program Files Microsoft Silverlight 2 0 31005 0 standalone 这会生
  • 函数式 GUI 编程可能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近发现了 FP bug 试图学习 Haskell 到目前为止所看到的东西给我留下了深刻的印象 一流的函数 惰性求值和所有其他好处 我还不是专
  • F# 是卡牌游戏 AI 的好语言吗? [关闭]

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

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • 如何在 FsCheck 中注册任意实例并让 xUnit 使用它?

    我有一个类型Average有一个字段count这是积极的int64 and a double字段称为sum 我做了一个任意的生成有效实例的操作 let AverageGen Gen map2 fun s c gt Average float
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • F# 在类型提供程序内的类型扩展函数中生成类型

    我有以下问题 在我的类型提供程序中 我需要使用一个返回此泛型类型实例的方法来扩展我之前定义的泛型类型 我的意思是 假设我们有 type receiveType lt a gt class val Next int val Type stri
  • F# 中类型约束的顺序

    这适用于 F 4 0 type Something lt a b when b gt seq lt b gt gt 这不会 type Something lt b when b gt seq lt b gt a gt 类型名称中出现意外的符
  • F# 获取随机数列表

    我正在尝试用随机数填充列表 但很难获得随机数部分 我现在打印出一个随机数 10 次 我想要的是打印出 10 个不同的随机数 let a new System Random Next 1 1000 let listOfSquares for
  • F# 编码练习

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

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • F# 和模糊逻辑

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

随机推荐

  • 使用 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财产 我想我必须在这里做同样的事情 但不知道如何做