扩展 F# 中的枚举类型

2024-02-26

与 F# 功能相关的另一个问题称为“类型扩展” http://msdn.microsoft.com/en-us/library/dd233211.aspx.

在 F# 中扩展枚举似乎是不可能的。我用C# 扩展方法 http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx扩展枚举有很多:添加范围验证逻辑、返回字符串表示的方法等。

不幸的是,似乎只能扩大受歧视的工会,但无法扩展简单的枚举:

1. 内在延伸

// CustomEnum.fs
module CustomEnumModule

type CustomEnum = 
    | Value1 = 1
    | Value2 = 2

// Trying to split definition of the enum
type CustomEnum with 
    | Value3 = 3

错误:“错误 FS0010:意外的符号 '|'在成员定义中”

2. 可选扩展

// CustomEnumEx.fs
open CustomEnumModule

type CustomEnum with
    member public x.PrintValue() =
        printfn "%A" x

错误:“错误 FS0896:枚举不能有成员”

这对我来说似乎很奇怪,因为(1)我们可以将简单的枚举视为全功能歧视联合的特例,并且我们can扩展可区分联合和 (2) 扩展 .NET 枚举是向现有基础设施添加一些功能(包括 FP 功能)的好方法。

这种行为是故意的还是实施中的简单错误?

附:很遗憾F# Spec http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html在这方面保持沉默,或者至少我找不到那里的一种或另一种行为的任何证据。


可以创建与类型同名的模块,类似于扩展类型:

type CustomEnum = Value1 = 1 | Value2 = 2

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module CustomEnum =
    let Print = function
    | CustomEnum.Value1 -> "One"
    | CustomEnum.Value2 -> "Two"
    | _ -> invalidArg "" ""

let value = CustomEnum.Value1

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

扩展 F# 中的枚举类型 的相关文章

  • F# 设置带有参数的 SQLCommand 的最佳方法

    我的 F 程序需要与 SQL Server 通信 在一部分中我有这样的事情 let workFlowDetailRuncommand new SqlCommand query econnection workFlowDetailRuncom
  • 在 F# 中组合谓词

    F 中是否有逻辑组合谓词的标准方法 例如 假设我有isCar x and isBlue x然后我想要一些能给我的东西 let isBlueCar x isCar x isBlue x 但是使用某种组合而不是调用 可能像 let isBlue
  • 定义具有多种消息类型的消息传递域

    到目前为止 我见过的大多数 F 消息传递示例都使用 2 4 种消息类型 并且能够利用模式匹配将每条消息定向到其正确的处理函数 对于我的应用程序 由于处理和所需参数的不同性质 我需要数百种独特的消息类型 到目前为止 每个消息类型都是其自己的记
  • 为什么 foreach 找不到我的 GetEnumerator 扩展方法?

    我正在努力使一些代码更具可读性 例如foreach var row in table 而不是foreach DataRow row in table Rows 为此 我创建了一个扩展方法 namespace System Data publ
  • 如何使用 printf 自定义自定义类型的输出?

    我已经阅读了很多内容专家 F 并正在致力于构建一个实际的应用程序 在调试时 我已经习惯了传递这样的 fsi 命令 以使 repl 窗口中的内容清晰可见 fsi AddPrinter fun x myType gt myType ToStri
  • 绘图 Deedle 框架

    我有以下代码 let mychart frame GetAllSeries gt Seq iter fun key value gt Chart Line value Name key gt Chart Combine where fram
  • 与 F# List.nth 的参数顺序混淆

    List nth is T 列表 gt 整数 gt T 而不是标准int gt T 列表 gt T like Seq nth 这使得管道有些尴尬 难道幕后有什么事情吗 我不知道为什么 可能是为了ocaml兼容性 http www csc v
  • 将接口作为参数传递给扩展方法

    我使用扩展方法来扩展 html 助手来制作 RSS 转发器 public static string RSSRepeater this HtmlHelper html IEnumerable
  • 在 F# 中实现返回 Task 的 C# 方法

    我正在 F 中创建一个类型 该类型继承自 C 类 该类公开返回的方法Task
  • 如何解决“程序主模块为空:运行时不会发生任何事情”

    我在 F 解决方案中有两个项目 1 主要项目有 EntryPoint http msdn microsoft com en us library dd402151 aspx并设置为启动项目 2 support 第二个项目 拥有一组支持模块
  • F# 参数传递

    我一直认为 F 有两种不同的方式来传递参数 柯里化风格和元组风格 这实际上是正确的吗 是不是很简单一种风格 柯里化风格和参数可以是简单值或元组 e g someFunc a b 这不是一个函数吗one咖喱风格的参数恰好是一个元组 因此允许我
  • 在 F# 中“合并”受歧视的联合?

    继从这个问题 https stackoverflow com questions 53506325 result vs raise in f async 我在组合不同类型时遇到问题Result类型在一起 以下是一个人为的示例 不是真实的代码
  • ProjectCracker 与 .netstandard 2.0 项目

    我的团队最近从使用 net 框架转向使用 net 标准 2 0 作为我们的 F 库 我们有一些在项目上运行的内部脚本来自动生成 Markdown 文档 这些脚本使用 F 编译器服务 SDK 来分析代码并检索类型元数据 文档注释等 我们正在使
  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

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

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 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
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • UrlHelper 扩展方法不起作用

    我正在尝试向我的 MVC 2 项目添加扩展方法 但没有成功 经过几个小时的谷歌搜索和查看这里后我不知所措 我创建了一个全新的 MVC 2 项目 以确保我现有的项目没有任何奇怪的地方 但我仍然面临同样的问题 我确信这是一种 只见树木 不见森林

随机推荐