如何派生具有类型族的记录的实例

2023-12-04

这是我正在尝试但无法编译的内容:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE FlexibleInstances #-}

import Data.Text as T
import Data.Int (Int64)

type family Incoming validationResult baseType
type instance Incoming Validated baseType = baseType
type instance Incoming ValidationErrors baseType = Either [T.Text] baseType

data Validated
data ValidationErrors

data Tag = Tag {unTag :: T.Text} deriving (Eq, Show)

data NewTag f = NewTag
  {
    ntClientId :: Incoming f Int64
  , ntTag :: Incoming f Tag
  }

deriving instance (Show baseType) => Show (Incoming Validated baseType)
deriving instance (Show baseType) => Show (Incoming ValidationErrors baseType)

编译错误:

23  38 error           error:
 • Illegal type synonym family application in instance:
     Incoming Validated baseType
 • In the stand-alone deriving instance for
     ‘(Show baseType) => Show (Incoming Validated baseType)’ (intero)
24  38 error           error:
 • Illegal type synonym family application in instance:
     Incoming ValidationErrors baseType
 • In the stand-alone deriving instance for
     ‘(Show baseType) => Show (Incoming ValidationErrors baseType)’ (intero)

你这里有两个问题。第一个是 GHC 告诉你的。基本上,您不能拥有依赖于类型族的实例(类型族可以存在,但前提是它获得的所有参数都是具体类型)。一旦您允许这样做,各种不好的事情就会开始发生,其中最重要的是您的类型系列的右侧可能会调用其他类型系列。

通常,可以通过将类型族应用程序移至约束来解决此类问题:

deriving instance (Show baseType, i ~ Incoming Validated baseType) => Show i
deriving instance (Show baseType, i ~ Incoming ValidationErrors baseType) => Show i

这样做实际上使第二个问题变得明显:你的实例头太笼统了。

也就是说,我不确定是否有什么需要修复的 - 只需摆脱派生行即可。您希望第一个可以归结为:派生一个实例Show basetype鉴于Show basetype约束(这是完全没有意义的)。第二个同样毫无意义——Either已经有一个实例Show.

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

如何派生具有类型族的记录的实例 的相关文章

  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • Haskell:需要了解 Functor 的签名

    有人能给我解释一下 Functor 的签名吗 Prelude gt info Functor class Functor f gt where fmap a gt b gt f a gt f b lt a gt f b gt f a 我不明
  • Haskell 处理负参数

    尝试对两个值求和 其中只有一个为负值 例如 1 and 2 soma Float gt Float gt Float soma x1 x2 x1 x2 结果出现错误 为什么
  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 在 ghci 下执行 `(read "[Red]") :: [Color]` 时会发生什么?

    我正在阅读以下小节现实世界 Haskell 第 6 章 类型类 http book realworldhaskell org read using typeclasses html关于一个实例Read for Color 它实现了reads
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • 在列表中查找元素及其索引

    我需要让列表的两个元素都满足谓词and这些元素的索引 我可以通过以下方式实现这一点 import Data List findIndices list Int list 3 2 4 1 9 indices findIndices gt 2
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 如何测试自定义 StateT 的 Monad 实例?

    我正在学习 Monad Transformers 其中一个练习要求实现 Monad 实例StateT 我想使用以下方法测试我的实现是否符合 Monad 法则validity https github com NorfairKing vali

随机推荐

  • 某个日期出现超过x次,获取下一个可用日期

    我有一个包含 15 列的数据框 其中 1 列是参与者 ID 14 列是每个参与者可能的预约日期 不包括节假日和周末 Included Participant V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V1
  • 如何添加带有多个标记的 Google 地图,在加载和单击时显示信息窗口

    我正在尝试添加带有多个标记的 Google 地图 所有标记都有信息窗口 我想显示所有信息窗口在页面加载时默认显示 当有人单击地图或标记时 所有信息窗口都必须关闭 然后通过单击标记来显示 这是我试图实现它的方法
  • ddd - 覆盖每个属性的值对象

    实施与从网站导出产品和导入订单的第三方系统的集成 设计中已经完成了一些 ddd 工作 我希望继续下去 订单和产品上的每个属性都应该包含一个值对象吗 这意味着大约 100 个类来涵盖所有可能的属性 这似乎过多 产品Sku 产品名称 产品描述
  • JQuery - 延迟对象数组的 $.when 语法[重复]

    这个问题在这里已经有答案了 这是我第一次使用 when我在语法上遇到困难 我的代码类似于下面的简化示例 它有效 如果我在简化时没有引起错误 我的问题是我不知道家里的很多元素customerIds数组将包含 var customerIds n
  • 错误1053:服务没有及时响应启动或控制请求

    我最近继承了几个作为 Windows 服务运行的应用程序 并且在为它们提供 GUI 可从系统托盘中的上下文菜单访问 时遇到问题 我们需要 Windows 服务的 GUI 的原因是为了能够重新配置 Windows 服务的行为 而无需停止 重新
  • MySQL 获取行,但更喜欢一个列值而不是另一列值

    有点奇怪 我想编写一个 MySQL 查询来从表中获取结果 但更喜欢列的一个值而不是另一个值 即 id name value prioirty 1 name1 value1 NULL 2 name1 value1 1 3 name2 valu
  • 在Google Guava(Java)中,如何批量设置ArrayTable的值?

    我有一个二维数据数组 例如 V 我想批量设置数组表实例 我必须反复打电话吗ArrayTable put R rowKey C columnKey V value 我找不到合适的构造函数 静态创建助手或方法 例如 putAll V value
  • 如何指示应首先编辑变量

    我有以下实时模板 import NAME from PATH END 当它插入编辑器时 输入变量的顺序定义为 import 1 from 2 有什么办法可以改成 import 2 from 1 只需使用编辑变量编辑该实时模板时按钮 然后使用
  • 在 2.2 上获取 ListView 项目的视图/逆序;适用于 4.0.3

    我有一个 ListView 它显示 ArrayAdapter 中的项目 我想在点击视图时为其设置动画 问题是在不同版本的 android 上我得到不同的视图 见下文 我使用此方法从 ListActivity 获取视图 private Vie
  • Java:如何使用UrlConnection发送授权请求?

    我想向需要身份验证的服务器生成 POST 请求 我尝试使用以下方法 private synchronized String CreateNewProductPOST String urlString String encodedString
  • 如何将 KB2670838 包含在 InstallShield 2013 的安装程序中?

    我正在使用 InstallShield 2013 为需要的应用程序制作基本 MSI 安装程序Windows 平台更新 KB2670838 对于 NET 框架和其他要求 我在 Redistributables 部分的 InstallShiel
  • 使用包含竖线的正则表达式匹配字符串

    I have 123 456 789 我只能捕捉 123 使用正则表达式 d 但不确定如何捕获完整的字符串 我对此很陌生 我将感谢任何帮助 d 这应该有效 从竖线开始 重复数字和可选的竖线
  • Graphviz---随机节点顺序和经过标签的边

    我有以下点文件 digraph finite state machine rank same node shape doublecircle q 5 node shape circle q 1 gt q 2 label q 1 gt q 2
  • 无法使用pip安装python包,需要获取Microsoft Visual C++ 14.0

    我正在尝试安装pyjks 我正在管理命令提示符下运行所有 内容 最初尝试安装 pyjks 的结果是 C WINDOWS system32 gt pip install pyjks Collecting pyjks Collecting py
  • 带标题的 PHP Mail() 函数

    当我将 header 与 PHP mail 函数一起使用时 我总是很困难 问题总是一样的 去年 这次 只要我记得 就让我抓狂 问题在于标题仅显示在电子邮件中 收到的邮件示例 Source onderwerp Bedankt voor uw
  • 防止 jQuery Mobile 上的水平滚动

    有没有办法最好仅使用 CSS 来防止移动设备上的水平页面滚动 这是一个例子 http jsfiddle net YfLst 15 Update 以下代码解决了 iOS 上的问题 但 Android 上的问题仍然存在 html body ov
  • 如何在 Eclipse 中以调试模式运行外部工具

    由于各种原因 我的项目只能作为已完成且打包的 JAR 运行 组装时会发生一些神奇的事情 因此我将其作为 Eclipse 中的外部工具运行 我缺少的是调试功能 有没有办法在 Eclipse 中以调试模式运行外部工具 如果远程 JVM 已在调试
  • 记录完成谷歌表单所需的时间

    我正在尝试记录完成并提交 Google 表单所需的总时间 我的逻辑很简单 以下代码将记录时间戳并将其作为多项选择选项 然后 在提交表单后 我们无论如何都会得到一个时间戳 但与此同时 我们也会得到最初记录的时间戳作为该问题的答案 这是我可爱的
  • JSONEncoder 的 dateEncodingStrategy 不起作用

    我正在尝试使用 Swift 4 的 Encodable JSONEncoder 将结构序列化为字符串 该对象可以保存异构值 例如 String Array Date Int 等 除了日期之外 所使用的方法工作正常 JSON编码器的dateE
  • 如何派生具有类型族的记录的实例

    这是我正在尝试但无法编译的内容 LANGUAGE TypeFamilies LANGUAGE StandaloneDeriving LANGUAGE FlexibleInstances import Data Text as T impor