记录访问器的语法默认值

2023-11-26

像我以前一样写下答案刚才,我遇到了一个有趣的问题:

data Gender = Male | Female
            deriving (Eq, Show)

data Age = Baby | Child | PreTeen | Adult
         deriving (Eq, Show, Ord)

data Clothing = Pants Gender Age
              | Shirt Gender Age
              | Skirt Age         -- assumed to be Female
              deriving (Show, Eq)

假设我希望用记录语法编写最终的数据类型:

data Clothing = Pants {gender :: Gender, age :: Age}
              | Shirt {gender :: Gender, age :: Age}
              | Skirt {age :: Age}
              deriving (Show, Eq)

问题是,我想要gender $ Skirt foo总是评估Female(不管foo,这是一个Age)。我可以想出几种方法来实现这一点,但它们要求我要么

  1. 使用智能构造函数,理论上允许Skirt Male foo但不暴露构造函数
  2. 定义我自己的gender功能

对于#1,通过不在模块中公开构造函数,我有效地防止了模块的用户利用记录语法。对于#2,我必须完全放弃记录语法,或者定义一个附加函数gender',这再次击败了记录语法。

有没有一种方法既可以利用记录语法,又可以为我的构造函数之一提供“默认”、不可更改的值?我也对非记录语法解决方案持开放态度(也许是镜头?),只要它们同样优雅(或更优雅)。


有没有一种方法既可以利用记录语法,又可以为我的构造函数之一提供“默认”、不可更改的值?

在没有令人信服的反例的情况下,答案似乎是否定的。

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

记录访问器的语法默认值 的相关文章

  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • Haskell - lambda 表达式

    我试图了解什么是有用的以及如何在 Haskell 中实际使用 lambda 表达式 我不太明白使用 lambda 表达式相对于定义函数的约定方式有何优势 例如 我通常会执行以下操作 let add x y x y 我可以简单地打电话 add
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • Haskell 标准库是什么?

    GHC专用库可以称为标准库吗 或者只有 Haskell 2010 报告中的那些才算数 许多 GHC 库可以通过 Haskell 报告中的函数来实现 可能与 C 绑定相结合 但其他语言依赖于 GHC 特定的扩展 因为语言报告中定义的当前 Ha
  • 错误域=AVFoundationErrorDomain代码=-11814“无法记录”

    它不断给我错误 错误域 AVFoundationErrorDomain代码 11814 无法记录 我不确定问题是什么 我试图在拍照后计数器达到 1 时录制声音 static int counter counter will always b
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件

随机推荐

  • Jackson JSON - 反序列化 Commons MultiMap

    我想使用 JSON 序列化和反序列化 MultiMap Apache Commons 4 要测试的代码段 MultiMap
  • 非常量复制构造函数和返回值的隐式转换

    考虑以下 C 代码 struct B struct A A int A A missing const is intentional A B operator B A f return A 1 compiles fine return 1
  • 粘性灵活的页脚和页眉 CSS 在 WebKit 中工作正常,但在 Gecko 中不行

    我正在尝试构建一个允许灵活高度的页眉和页脚的布局 中间的部分占用剩余空间 中间的任何溢出都应该为该中间部分提供一个滚动条 我的适用于 Safari 和 Chrome 的代码是
  • Angular:构建后是否可以读取json文件

    我正在开发一个 Angular 7 项目 该项目需要在不同的服务器上运行 我需要从环境文件中读取服务器 URL 并且无法设置为静态变量 我尝试读取 JSON 文件 但一旦我ng build该项目 它将 JSON 的内容复制为 main js
  • MVC 中 OnChange 事件的 AJAX 调用

    我必须对作为视图一部分的下拉列表的 onchange 事件进行 AJAX 调用 在更改事件中 我需要调用数据库 进行一些计算以显示 UI 然后使用计算来填充图表控件 UI 显示按此顺序 图表 下拉类别列表 带有评分的子类别列表 因此 我需要
  • 使用 phpMyAdmin 的跟踪机制迁移数据库

    在开发数据库中 我在所有表上启用了 phpMyAdmin 跟踪 它记录了我对表结构所做的所有更改 在本例中我对数据跟踪不感兴趣 到目前为止一切顺利 然后我想要做的是为所有跟踪的表取出一份报告 其中包含特定版本 或者日期甚至可以工作 所做的更
  • django - django-taggit 形式

    我想用django taggit 点击这里 文档 点击这里 谈论使用ModelForm生成表单 但我已经有了我想使用的表单 假设我有这样的事情 forms py class MyForm forms Form tags forms Char
  • 在 sizeof 操作中取消引用空指针是否有效[重复]

    这个问题在这里已经有答案了 我遇到了一段代码 对我来说应该崩溃分段故障 但它仍然可以顺利工作 有问题的代码加上相关的数据结构如下 相关注释位于上面 typedef struct double length unsigned char nPl
  • 了解 C++ 指针(当它们指向指针时)

    我想我很好地理解了参考文献和指针 这是我 认为我 所知道的 int i 5 i is a primitive type the value is 5 i do not know the address int ptr a pointer t
  • Kinect:如何从一些深度数据获取骨架数据(从kinect获取,但我修改了一些地方)

    我可以从 Kinect 获取深度帧 然后修改帧中的数据 现在我想使用修改后的深度帧来获取骨架数据 我该怎么做 好吧 我发现没有办法用 microsoft kinect sdks 来做到这一点 现在 我发现使用 OpenNI 是可以的 它是
  • 将多条编码多段线合并为一条编码多段线

    我正在尝试将新的编码多段线与现有多段线合并 而不对整个多段线进行解码和重新编码 新编码的折线将上传到 linux 服务器 我想将其附加到现有的折线 问题是 你不能把它们混在一起 下面是一些可以使用的示例数据 我希望在 PHP 或 shell
  • 如何访问受保护的数组值?

    您好 我有这个数组 我不确定如何从中获取名称 品牌 图像 令牌值 Gloudemans Shoppingcart CartCollection Object items protected gt Array 1264477c2182cc04
  • asp.net:无效的回发或回调参数

    我收到此错误 Server Error in Application Invalid postback or callback argument Event validation is enabled using
  • 将字符串从 __DATE__ 转换为 time_t

    我正在尝试转换从生成的字符串 DATE 宏变成time t 我不需要一个成熟的日期 时间解析器 它只处理 DATE 宏会很棒 预处理器方法会很漂亮 但函数也同样有效 如果相关的话 我正在使用 MSVC 编辑 更正后的函数应如下所示 time
  • 没有 id 的 JPA 实体

    我有一个具有以下结构的数据库 CREATE TABLE entity id SERIAL name VARCHAR 255 PRIMARY KEY id CREATE TABLE entity property entity id SERI
  • 删除给定键总和为零的行

    我有一个查询 该查询将导致在我们的 SSRS 2008 R2 服务器上创建客户账单 SQL Server实例也是2008 R2 查询很大 出于安全原因等原因我不想发布整个内容 我需要对下面的示例数据执行的操作是从结果集中删除带有 73 19
  • 如何实现点尺度的反转函数?

    我正在尝试为我的双线图表添加工具提示 但是 我没有使用 timeScale 或scaleLinear 而是使用scalePoint 来绘制图表 我试图达到以下效果 https bl ocks org mbostock 3902569 thi
  • 向 ModelAndView 添加属性

    我正在写一个HandlerInterceptor需要将某个会话范围的 bean 插入到Model postHandle的签名如下所示 public void postHandle HttpServletRequest request Htt
  • 开发在 android 中以 kiosk 模式运行的应用程序

    如何使我们的应用程序像信息亭模式应用程序一样 SureLock lockdown app 我有 LG E400 root 的 Android 手机 Android 2 3 6 我想开发像这样的应用程序Surelock我需要什么来开发这样的应
  • 记录访问器的语法默认值

    像我以前一样写下答案刚才 我遇到了一个有趣的问题 data Gender Male Female deriving Eq Show data Age Baby Child PreTeen Adult deriving Eq Show Ord