如何在 Haskell 中派生 GADT 的数据实例?

2024-04-02

我有一个 GADT,它只与两个不同的参数一起使用,ForwardPossible 和 ():

-- | Used when a forward definition is possible.
data ForwardPossible = ForwardPossible deriving (Eq, Ord, Typeable, Data, Show)

-- | GADT which accepts forward definitions if parameter is ForwardPossible.
data OrForward t forward where
  OFKnown :: t -> OrForward t forward
  OFForward :: NamespaceID -> SrcSpan -> BS.ByteString -> OrForward t ForwardPossible

deriving instance Eq t => Eq (OrForward t forward)
deriving instance Ord t => Ord (OrForward t forward)
deriving instance Typeable2 OrForward
deriving instance Show t => Show (OrForward t forward)

我想派生足够的 Data.Data 实例来涵盖 OrForward t () 和 OrForward t ForwardPossible。我不认为一般的 (Data t, Dataforward) => OrForward t 转发实例是可能的,除非它普遍忽略 OFForward,但是 Data t => OrForward t ForwardPossible 和 (Data t, Dataforward) => 的重叠实例如果有办法让 ghc 派生这些实例,OrForward t 转发实例可能是一个解决方案。

我尝试过定义:

deriving instance Data t => Data (OrForward t ())
deriving instance Data t => Data (OrForward t ForwardPossible)

但随后 ghc 给了我这样的错误:

Duplicate type signature:
  Structure.hs:53:1-70: $tOrForward :: DataType
  Structure.hs:52:1-49: $tOrForward :: DataType

我发现了一种相当不干净的方法来解决这个问题,所以我将其放在这里,以防其他人找到更好的答案:

  1. 我在主结构模块之上创建了两个新模块,专门用于派生实例。我使用了一种方法来派生采用 ForwardPossible 的 GADT 专业化实例,另一种方法用于采用 () 的实例,利用 StandaloneDeriving 和FlexibleInstances。这避免了 ghc 添加的代码中通过将它们放在不同的模块中来实现 Data.Data 的内部符号冲突的问题。

  2. 我必须手动编写实例 Data t => Data (OrForward t ()) 以排除 OFForward 情况:

    instance Data t => Data (OrForward t ()) where
      gfoldl k z (OFKnown a1) = (z OFKnown `k` a1)
      gunfold k z c = case constrIndex c of
      _ -> k (z OFKnown)
      toConstr _ = cOFKnown
      dataTypeOf _ = tOrForward
      dataCast2 f = gcast2 f
    
    tOrForward :: Data.Data.DataType
    tOrForward =
      mkDataType
        "Data.FieldML.Structure.OrForward"
        [cOFKnown]
    
    cOFKnown :: Data.Data.Constr
    cOFKnown = mkConstr tOrForward
                 "OFKnown" [] Prefix
    
  3. Data t => Data(或转发到转发可能)的实例可以导出:

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

如何在 Haskell 中派生 GADT 的数据实例? 的相关文章

  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

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

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 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
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 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 的
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 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 我不明
  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看

随机推荐

  • 静音时的 CSCore 环回录音

    我在用着CSCore WasapiLoopbackCapture录制系统声音 但当系统没有声音时 根本不录音 例如 在播放音乐并录制音乐时 输出文件的持续时间小于曲目的持续时间 我希望它即使在系统中没有声音时也能继续录制 但我没有找到任何属
  • DisplayFormat 数据注释不起作用

    我的模型类中有以下数据注释 Required ErrorMessage Required DisplayFormat ApplyFormatInEditMode true DataFormatString 0 MM dd yyyy publ
  • Safari 中的 css 颜色渲染不同

    我正在尝试为我的网络应用程序选择颜色 但意识到与 Firefox 或 Chrome 相比 Safari 呈现样式表的方式存在巨大差异 屏幕截图中的红色应该是 ff3366 但 safari 似乎选择渲染 ff0036 我不知道为什么我找不到
  • 在 Javascript 中处理多个按键事件的最佳方法是什么?

    游戏中按空格键会进行角色射击 出现确认框时按空格键会使该框消失 高分形式按空格键会在输入框中添加一个空格 在此示例中 同一键有多个事件 但一次仅触发一个事件 是否有通用 或特定于Javascript 方法或编程方式将事件添加到某个键 以便它
  • 将包含对象的数组转换为不带 foreach 的关联数组

    我有一个类似的数组 json decode 的结果 array 2 0 gt object stdClass 1 3 key gt string 6 sample startYear gt string 4 2000 endYear gt
  • Highchart 动态创建 - 无法正确渲染

    我正在使用动态函数制作高图绘图 在调用函数后它根本不会渲染 稍后如果我调整窗口大小 它会渲染数据吗 有什么具体原因吗 我的功能 var chart document ready function function randomData le
  • R - ggplot2,几个问题,多个相关图

    我在堆栈上问的第一个问题 我对 R 还很陌生 所以请原谅任何冒犯礼仪的行为 我正在使用 ggplot2 绘制 2 个堆积面积图 数据是来自 Oracle 数据库的等待事件 这是一个性能调整图表 我有几个问题 下面的两个图没有正确排列 很可能
  • 如何为 ggplot2 中具有稳定映射的分类变量分配颜色?

    上个月我一直在加快 R 的学习速度 这是我的问题 在 ggplot2 中为具有稳定映射的分类变量分配颜色的好方法是什么 我需要在具有不同子集和不同数量的 calcategories 变量的一组图表中保持一致的颜色 例如 plot1 lt g
  • C++“声明和初始化”语句是表达式吗?

    语言标准说 注 第 5 条定义了语法 求值顺序和含义 58 表达式是一系列运算符和 指定计算的操作数 一个表达式可以产生一个 值并可能引起副作用 尾注 例如 我有下面的代码 int i 1 A obj 那么 上述两种说法都算 表达 吗 st
  • 在Python中的下划线处分割并存储第一个值

    我有一个像 df 这样的 pandas 数据框 带有列构造名称 construct name aaaa t1 2 cccc t4 10 bbbb g3 3 等等 我想首先拆分下划线处的所有名称 并将第一个元素 aaaa cccc 等 存储为
  • Ajax成功函数未接收数据

    下面是我的网络表单的网络方法 它返回数据列表并且工作正常 WebMethod public static List
  • 与 Assembly Load(byte[] rawAssembly) 相反的操作

    我注意到有一种方法System Reflection Assembly 即Assembly Load byte rawAssembly 我想知道是否有类似的相反操作byte Store Assembly assembly 如果没有 我如何将
  • 用于创建具有合并功能的电子邮件模板的良好库

    我正在寻找一个非常好的库 组件 框架来为我的网络应用程序创建电子邮件模板 我们定期发送一些电子邮件 激活你的帐号 Welcome 感谢您的订单 Etc 我想为我的网络应用程序的非技术管理员提供一种方法 查看当前的电子邮件模板 HTML 所见
  • python字符串'“':字符串内的单双引号

    双引号看起来像这样 如果我把它放在 python 字符串中 我会得到这个 在python中 我可以在字符串中放入两个双引号 这会打印为两个双引号 但是 我不能像以前一样在字符串中放置一个双引号 我在 eclipse 中使用 pydev 执行
  • 根据键名从 HashMap 获取字符串值

    我有一个HashMap有各种键和值 我怎样才能得到一个值 我在地图上有一把钥匙叫my code 它应该包含一个字符串 我怎样才能得到它而不必遍历地图 到目前为止我已经 HashMap newMap new HashMap paramMap
  • 仍然可以通过 put 和 printf 到达

    Valgrind 正在报告 printf 和 put 等函数上仍可到达的 错误 我真的不知道该怎么办 我需要摆脱它 因为这是一个学校项目 不能有任何错误 我该如何处理这个问题 从报告中我可以看到这些函数使用malloc 但我一直以为他们自己
  • 使用 XUnit 断言异常

    我是 XUnit 和 Moq 的新手 我有一个以字符串作为参数的方法 如何使用 XUnit 处理异常 Fact public void ProfileRepository GetSettingsForUserIDWithInvalidArg
  • 如何将 java 代理附加到正在运行的 spring-boot 应用程序

    我有一个 spring boot 应用程序打包成在端口上运行的 war 现在我想将 java 代理附加到该应用程序 以使用 Prometheus 监控微服务 但不使用任何 Spring 插件来抓取指标 为此 我找到了一种通过启动应用程序来运
  • 如何让 SharePoint 链接列表默认在新窗口中打开?

    在 SharePoint 中 可以轻松设置由指向其他文档 文件夹 网站等的链接组成的列表 Web 部件 不幸的是 单击这些链接时 默认行为是在当前浏览器窗口中打开页面 也就是说 它不会在浏览器的新实例中打开页面 事实证明 这对我网站上的许多
  • 如何在 Haskell 中派生 GADT 的数据实例?

    我有一个 GADT 它只与两个不同的参数一起使用 ForwardPossible 和 Used when a forward definition is possible data ForwardPossible ForwardPossib