记录语法和求和类型

2024-06-25

我有关于 Haskell 中的总和类型的问题。

我想创建一个由两个或多个其他类型组成的总和类型,并且每个类型可能包含多个字段。一个简单的例子是这样的:

data T3 = T1 { a :: Int, b :: Float} | T2 { x :: Char } deriving (Show)

以我的理解,T1 and T2是使用记录语法的数据构造函数。看来定义是T3将随着字段数量的增加而增长T1 or T2增加。我的问题是,如果字段数量很大,如何实际处理这些求和类型构造函数?或者,将 sum 类型与记录语法混合是一个好主意吗?


我不太明白你有什么顾虑,但回答最后一行的问题:no,将求和类型与记录语法混合起来并不是一个好主意。一般来说,记录仍然是 Haskell 语言的一个弱点;他们根本不能很好地处理范围界定。只要您只有一些具有不同唱片公司的单独类型,通常就没有问题,但是一旦出现总和类型或名称冲突,情况就会变得相当糟糕。

特别是,Haskell 允许您使用记录字段访问器T1任何类型值的构造函数T3print $ a (T2 'x')将在没有警告的情况下编译,但在运行时给出相当难以预见的错误。

在您的示例中,幸运的是,您似乎可以轻松避免这种麻烦:

data T3 = T3_1 T1 | T3_2 T2
           deriving (Show)
data T1 = T1 { a :: Int
             , b :: Float}
           deriving (Show)
data T2 = T2 { x :: Char }
           deriving (Show)

现在,您可以编写的任何解构都将经过正确的类型检查以使其有意义。

And such a structure of meaningful, small specialised sub-types is generally better to handle than a single monolithic type, especially if you have many functions that really deal only with part of the data structure.

另一方面是,解开构造函数的层会变得极其繁琐,但幸运的是,现在这个问题已经解决了:镜头库 http://lens.github.io/允许您非常整齐地组合访问器/修饰符。

说到已解决的问题:尼基塔·沃尔科夫 https://nikita-volkov.github.io/record/提出了一个非常好的概念来完全替换充满问题的记录语法。


Um... actually these aren't subtypes in any proper sense of the word, but you get what I mean.

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

记录语法和求和类型 的相关文章

  • 类型通过联合分配意味着什么?

    我正在读一篇文章 在 TypeScript 中 我们最强大的工具是条件类型 这是 因为他们有两个独特的能力 他们通过工会进行分配 它们使您能够使用 infer 关键字 在一般情况下以及在这种情况下 在工会上分配 意味着什么 期限分配性的指的
  • 如何计算函数被调用的次数,FP方式

    我目前正在通过SICP http mitpress mit edu sicp 与哈斯克尔 练习 1 15 询问一个函数被调用了多少次 这个想法可能是您应该使用替换方法 但我想知道如何在代码中执行此操作 在命令式语言中 我们可以保留一个全局变
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • Coq:Type(n) 中的 Prop 与 Set

    我想考虑以下三个 相关的 Coq 定义 Inductive nat1 Prop z1 nat1 s1 nat1 gt nat1 Inductive nat2 Set z2 nat2 s2 nat2 gt nat2 Inductive nat
  • Haskell 中是否可以部分应用第 n 个参数?

    我很好奇是否可以写一个函数apply nth它接受一个函数 参数的数量以及该参数的值 然后返回一个新的 部分应用的函数 我的感觉是 由于类型系统的原因 这是不可能的 但我无法给出令人满意的答案 我也无法提出工作类型签名 如果语言的类型更加松
  • Haskell 中存在量化值的列表

    我想知道为什么这段代码不进行类型检查 LANGUAGE ScopedTypeVariables Rank2Types RankNTypes OPTIONS fglasgow exts module Main where foo forall
  • 无法让 wxHaskell 在 Mac 上从 ghci 工作

    我正在尝试跑步一个例子 http www haskell org haskellwiki WxHaskell Quick start Hello world in wxHaskell using EnableGUI function htt
  • Pandas 报告系列为小数时为对象

    我需要一种自动可靠的方法来查找 pandas 数据框中每列的数据类型 我一直在使用 dtype 但注意到它有一些意想不到的东西 考虑这个 10 行数据框 df a Out 6 0 250 00 1 750 00 2 0 00 3 0 00
  • 当给定部分限定类型名称时,Type.GetType 如何工作?

    在很多地方我都遇到过以下形式的部分限定类型名称FullTypeName AssemblyName 即像Type AssemblyQualifiedName仅没有版本 区域性和 publicKeyToken 限定符 我的问题是如何将其转换为相
  • 类型定义:期望UnionAll,得到TypeVar

    在 v0 6 的 Julia 手册中 我发现以下内容 abstract type Pointy T end struct Point T lt Pointy T x T y T end 这工作得很好 我认为以下也应该 abstract ty
  • C++ 获取成员函数的类型(返回类型和签名),不带成员函数的“const”限定符

    是否可以在没有成员函数的 const 限定符的情况下获取成员函数的类型 返回类型和签名 到目前为止 我尝试使用 decltype T 和 std remove const std decay Example void Func std st
  • Haskell 程序查找列表中元素的位置

    我需要编写一个函数来查找列表中一个特定元素的位置 我是这样写的 findPos list elt list 1 head list elt 0 otherwise 1 findPos tail list elt 但是如果列表中元素重复怎么办
  • 我必须实现 Applicative 和 Functor 来实现 Monad

    我正在尝试实现一个 Monad 实例 作为一个更简单的示例 假设如下 data Maybee a Notheeng Juust a instance Monad Maybee where return x Juust x Notheeng
  • Haskell 中的纯函数是否有可能改变变量的本地副本?

    Haskell 中的纯函数是否有可能改变变量的本地副本 就像 clojure 中提到的那样函数式编程是一个骗局 http swannodette github io 2013 06 10 porting notchs minecraft d
  • Haskell 类型族中的类型歧义

    我正在尝试整理以下课程Domain及其实例TrivialDomain LANGUAGE TypeFamilies data Transition Transition class Domain d where type Set d type
  • Haskell 中将函数与类型关联起来

    假设您有一个序列化器 反序列化器类型类 class SerDes a where ser a gt ByteString des ByteString gt a 事实证明 为每种类型提供一个特殊的辅助函数至关重要a e g compress
  • 如何重置/清除文件输入

    我从输入类型 文件重置图像文件时遇到了这个问题 这就是场景 我设置了一个图像 然后单击 取消 按钮 这意味着它被重置 然后我将再次设置相同的图像 它不会设置 我不知道为什么 但我认为这是一个错误 这是我用于重置图像 表单的代码 resetI
  • 错误:“导航器”类型上不存在属性“通知”

    我正在尝试使用 ionic 插件cordova plugin dialogs 插件正在运行 我可以调用navigator notification alert 并创建一个本机警报提示 但每当我的应用程序构建时 我都会收到以下控制台错误 错误
  • 为什么这个 HasField 实例没有被解析?

    我在用着GHC 8 2 1 我有以下模块 LANGUAGE FlexibleInstances LANGUAGE MultiParamTypeClasses LANGUAGE UndecidableInstances LANGUAGE Ty
  • 如何查找列表中元素的索引?

    给定列表中的一个元素 我可以使用哪个函数来查找其索引 例如 我想在列表中找到 3 的索引 1 2 3 4 Haskell 中有哪个函数可以用于此目的 看看这里 在 Haskell 中查找列表中元素的索引 https stackoverflo

随机推荐

  • 如何将redis中的数据保存到磁盘中的文件并读回redis?

    我可以在程序中写入 Redis 并从中读取 但是 关闭服务器后 我猜数据已从内存中删除 如何将redis中的数据保存到磁盘中 以便下次打开redis时 它可以打开数据 让控制台程序读取它吗 如果我的电脑突然断电重启 redis可以恢复状态吗
  • Webpack“OTS 解析错误”加载字体

    我的 webpack 配置指定应使用加载字体url loader 当我尝试使用 Chrome 查看该页面时 出现以下错误 OTS parsing error invalid version tag Failed to decode down
  • 从 JSP 文件中的会话范围 bean 访问数据

    我正在尝试在 Spring Web MVC 3 中开始使用会话范围的 bean 我将这一行放入我的调度程序配置中
  • Linq OrderBy(Byte[]) 值

    public class foo int ID get set byte sort get set public class barMaster public void FooSource return List
  • 如何在文件上传和插入数据库的同时加载 gif

    我必须先将文件加载到临时位置 然后再读取文件并将其插入数据库 但是我如何在执行所有这些操作时包含加载 gif 有人可以告诉我吗 谢谢
  • WPF 在 .NET Framework 4.0 中的 x64 上启动缓慢

    我注意到 如果我为任何 CPU x64 构建 WPF 应用程序 则与在 x86 上启动 在发布和调试模式下 相比 启动 大约 20 秒 或加载新控件所需的时间要长得多 VS 的内部或外部 即使是最简单的 WPF 应用程序也会出现这种情况 该
  • SQL 表别名 - 好还是坏? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 SQL 中使用表别名有哪些优点和缺点 我个人会尽量避免使用它们 因为我认为它们会使代码的可读性降低 特别是在阅读大型 where and 语
  • ASP.NET MVC 最佳实施实践

    最近 我被要求完全重写和重新设计一个网站 该公司的所有者强调 他希望该网站采用最新 最先进的技术来制作 但要避免额外的成本 截至目前 我在研究 CMS 实现和使用 MVC 编写新实现之间左右为难 该网站主要是宣传册件 但需要允许访问者通过表
  • Elixir 1.3.0:String.strip/1 和 String.strip/2 API 文档缺失。

    Elixir 1 3 0 似乎不再显示 String strip 1 和 String strip 2 的文档 iex 1 gt h String strip No documentation for String strip was fo
  • Pthreads PHP:并行执行 Foreach 循环

    如何将核心 PHP 代码转换为 Pthread 代码 我的核心 PHP 代码 require once xyz php count 0 foreach sites as site require once allsite site php
  • 二进制 Blob 截断为 8000 字节 - SQL Server 2008 / varbinary(max)

    我已经从 Fluent Nhibernate 1 0 和 Nhibernate 2 1 升级到 pre 使用 NHibernate 3 0 GA 发布 1 x 并达到了我认为的回归 但我想听听是否确实如此 我正在使用 SQL Server
  • 冻结 Python 应用程序时创建更少的文件

    我正在使用 cxFreeze 冻结我的 Python 应用程序 一切似乎都按预期工作 但查看构建目录让我思考 有没有办法可以减少构建目录中的文件 目前 有一堆 PYD 文件和必要的 DLL 文件 然后我有一些配置文件 自定义 其余的内容被放
  • Scrapy - 使用蜘蛛名称同时记录到文件和标准输出

    我决定使用 Python 日志记录模块 因为 Twisted on std error 生成的消息太长 我想INFO级别有意义的消息 例如由StatsCollector在维护屏幕消息的同时写入单独的日志文件 from twisted pyt
  • 如何在shell脚本中扩展相对路径

    我正在编写一个脚本来使用 bash 在 linux 2 6 上设置环境变量 因此该脚本包含如下命令 export SRC DIR export LIBPATH SRC DIR lib 问题是 当我尝试 echo LIBPATH 时 它显示
  • LINQWhere(谓词)与FirstOrDefault(谓词)

    以下之间是否存在明显的性能差异 something Where predicate FirstOrDefault and something FirstOrDefault predicate 我倾向于同时使用两者 但我想知道在性能方面是否有
  • 如何在表单提交事件*之后*运行一些 JavaScript?

    我正在处理一个 HTML 表单 可能需要几秒钟才能提交 我想禁用表单中的某些字段after已提交 我可以在表单的处理程序中执行此操作submit事件 但这会引发before表单提交 如果我禁用这些控件 它们的值不会包含在发送到服务器的发布数
  • Plotly:在同一个图中绘制直线和散点图

    我有一个带有 DateTimeIndex 和数字数据列的 pandas DataFrame 我使用它创建了一个折线图px line 我现在想突出显示线上的某些点 为此 我决定覆盖一个散点图 其行是初始 DataFrame 行的子集 我尝试过
  • 具有基本身份验证的 Nginx-ingress Kubernetes 路由

    我无法在我的路径之一上设置基本身份验证 我想拥有 auth由基本身份验证保护的路径 所有其他路径不需要基本身份验证 所以我创建了两个指向同一个后端的入口文件 非身份验证入口 apiVersion extensions v1beta1 kin
  • 在azure databrick中使用pyodbc与SQL服务器连接

    import pyodbc pyodbc connect Driver SQL SERVER Server server name Database database name UID my uid PWD my password Auth
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh