F# 理解歧视联合

2024-01-14

我之前问过这个问题,很抱歉再次问类似的问题。但不幸的是,我无法真正理解如何设计一个受歧视的工会。

所以我有一堆数据结构,看起来像

类型艺术家(艺术家 ID:int,名称:字符串)= 做 如果 name = null 则 nullArg String.Empty 新(艺术家ID:int)=艺术家(艺术家ID) 成员 x.ArtistId = 艺术家Id 成员 x.Name = 姓名

和流派()= 让可变名称 = String.Empty 让可变的 GenreId : int = 0 让可变描述 = String.Empty 让可变相册 = List.empty 会员 x. 描述 其中 get() = 描述 和 set( value ) = 描述 成员x.专辑 get() = 专辑并 set ( value ) = 专辑

和专辑()= 让可变标题 = String.Empty 让可变albumId = 0 让可变的genreId = 0 让可变的artistId = 0 让可变价格:decimal = Decimal.Zero 让可变albumArtUrl = String.Empty 让可变流派 = new Genre() 让可变艺术家=新艺术家(artistId) 会员x.头衔 get() = 标题并 set (value) = 标题

在此处输入代码

我尝试根据一些 F# 专家的建议将上述定义为受歧视的联合

我定义如下

类型名称 = 字符串 输入专辑 ID = int

输入艺术家= |艺术家 ID 为 int |艺术家名字

输入专辑= |字符串标题 |小数价格 |专辑AlbumId * 艺术家 |字符串的AlbumArtUrl

类型类型= | int 类型 |名称类型 * 专辑列表

enter code here

可区分联合用于表示具有多种不同情况的类型,这大致对应于面向对象语言中的类层次结构。例如,一个基类Shape有两个继承类Circle and Rectangle可以这样定义:

type Shape = 
  | Rectangle of (float * float) * (float * float) // Carries locations of two corners
  | Circle of (float * float) * float              // Carries center and diameter

您定义受歧视工会的方式并没有真正达到您的预期目的。你的类型Album, Artist and Genre仅代表一个具体类型。

您可以使用记录(就像只有属性的轻量级类)或使用有区别的联合来表示这些单一案例,它对应于单个类,但具有相当轻量级的语法,这是主要的好处。例如:

type Name = string  
type Price = decimal
type AlbumId = int  
type ArtistId = int  

type Artist = Artist of ArtistId * Name 
type Album = Album of AlbumId * Name * Price * Artist

要构建一个艺术家和一些专辑,你可以这样写:

let pinkFloyd = Artist(1, "Pink Floyd")

let darkSide = Album(1, "The Dark Side of the Moon", 12.0M, pinkFloyd)
let finalCut = Album(2, "The Final Cut", 11.0M, pinkFloyd)

如果您随后创建一个流派,它将包含专辑列表,可能还包含艺术家列表,因此您可以编写如下内容:

type Genre = Genre of Name * Artist list * Album list 

let rock = Genre("Rock", [pinkFloyd], [darkSide; finalCut])

现在的问题是,您实际上想要如何填充类型。您的数据源是什么?如果您要从数据库或 XML 文件加载数据,您可能需要编写一个函数来获取数据源的某些部分并返回Artist or Album加载所有专辑和艺术家后,将它们包装在Genre并将其作为最终结果返回。

PS:回答你的问题有点困难,因为你并没有真正给出你想要做什么的更大的图景。如果您可以给出一个小而具体的示例(包括数据的加载及其使用),那么有人可以帮助您从更实用的角度来看待问题。

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

F# 理解歧视联合 的相关文章

  • 带表达式的 F# 类型定义

    是否可以这样表达 type id int gt 0 我知道它不可能静态执行 因为这意味着 F 具有依赖类型 在 C 中 我习惯于使用代码契约来执行此类操作并获得运行时强制执行 我正在这里寻找类似的东西 Thanks 编辑 感谢您提供的所有答
  • F# 和 MEF:导出函数

    因此 我试图在 F 控制台应用程序中运行这个简单的测试 open System Reflection open System ComponentModel Composition open System ComponentModel Com
  • F# 中的动态编程

    实现解决问题的动态规划算法的最优雅的方法是什么子问题重叠的问题 http en wikipedia org wiki Overlapping subproblem 在命令式编程中 人们通常会创建一个按问题大小索引的数组 至少在一维 然后算法
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • 您可以使用 .net core 运行 F# 脚本文件 (.fsx) 吗?

    是否可以使用 net core 运行 fsx 文件 相当于fsharpi在单声道上 它在 NETCore v3 0 或更高版本中开箱即用 cat hello fsx usr bin env fsharpi printfn hello wor
  • 地图中的一组键

    我有一个地图 X 我试图获取一组满足特定条件的键 如下所示 Map Keys X gt Set filter fun x gt 但我找不到从 F 的 Map 集合中获取密钥的方法 转换你的map http msdn microsoft co
  • 如何在 F# 中进行卷积?

    我想convolve http en wikipedia org wiki Convolution具有离散滤波器的离散信号 信号和滤波器是 F 中的浮点数序列 我能弄清楚如何做到这一点的唯一方法是使用两个嵌套的 for 循环和一个可变数组来
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 如何让一条记录实现一个接口?

    如果我有一个界面 type IData abstract member firstName string abstract member lastName string 如何定义符合此接口的记录类型 我尝试了如下所示 gt type Dat
  • 如何使用 WebSharper 在服务器上生成 Google Visualizations 数据

    我的目标是能够在服务器上为 Google Visualizations 生成数据 然后将其作为 java 脚本传递给客户端 以便可以将其呈现为折线图 我下面的示例可以正确编译 但在浏览器中呈现时会产生错误 在服务器上构建 DataCommo
  • 使用 FParsec 解析 int 或 float

    我正在尝试使用 FParsec 解析文件 该文件由 float 或 int 值组成 我面临两个问题 无法找到好的解决方案 1 Both pint32 and pfloat将成功解析相同的字符串 但给出不同的答案 例如pint32将返回3解析
  • 将可区分的联合传递给 InlineData 属性

    我正在尝试对一个解析器进行单元测试 该解析器解析字符串并返回相应的抽象语法树 表示为可区分的联合 我认为使用 Xunit Extensions 属性会非常紧凑InlineData将所有测试用例堆叠在一起
  • 在类型扩展中重载运算符

    好的 所以我基本上尝试将绑定运算符添加到选项类型中 似乎我尝试的所有内容都有一些不明显的警告阻止我这样做 我怀疑这与 NET 类型系统的限制有关 并且可能与类型类无法在用户代码中实现的原因相同 不管怎样 我已经尝试了一些事情 首先 我尝试了
  • 专家 f# 脚本编译奇怪

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

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

    这段 F 代码 let rec reformat new EventHandler fun gt b TextChanged RemoveHandler reformat b gt ScrollParser rewrite contents
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • 何时使用接口,何时使用高阶函数?

    给定一个具有以下层的 ASP NET MVC 应用程序 UI 视图 CSS Javascript 等 控制器 服务 包含业务逻辑和数据访问 没有单独的数据访问层的原因是我正在使用 SQL 类型提供程序 以下代码可能不起作用 因为它只是原始草
  • 如何使用反射来确定 F# 联合类型是否是类似枚举的联合(每种情况下都没有字段)

    术语 在下面的文章中 我将使用术语 引用枚举 来指代 F 类型 该类型是在每种情况下都没有字段的可区分联合 例如 type AReferenceEnum Yes No Maybe 要求 我需要一个给定的函数Type 返回一个bool告诉类型
  • 如何在 F# 中组合 Result<> 列表?

    用这个代码 let a 3 4 5 6 7 let check x if x 2 0 then Ok x else Error x let b a gt List map check 我如何将 B 总结为 如果一切OK 则Ok 如果有任何错

随机推荐