如何在 Haskell 中建模分层数据类型?

2023-12-01

我有很多类型,它们的层次结构存储了一些有用的信息。我试图避免将类型层次结构的知识融入到对其进行操作的函数中。

以下是斯坦福自然语言处理的类型依赖的一小段摘录:

root - root
dep - dependent
  aux - auxiliary
    auxpass - passive auxiliary 
    cop - copula
  arg - argument 
    agent - agent

我想创建一些反映此结构的数据类型,以便我可以定义一些只能对某些类型进行操作的函数。当我有一个运行在arg,我用来表示的类型arg还应包括agent但类型为agent不应包括arg。类型为dep应该包括其下面的任何内容。

这在 haskell 中可能吗?我一直在尝试声明各种data类型来对此进行建模,但我无法让它工作,因为数据类型不能使用另一种数据类型的构造函数。

我怀疑这种方法可能不适用于 Haskell,所以如果是这种情况,您通常如何处理这些绝对不希望扁平化层次结构的情况?


一般来说,子类型与 Haskell 配合得不太好。但是,如果您只是尝试建模(非多重)继承(因此您有子类型树而不是晶格),则实际上可以使用类型类构建子类型。这是一个简短的要点,正是这样做的。从那里开始,您定义数据类型

data Root = Root ...
data Dep = Dependent ...
data Aux = Auxiliary ...
data AuxPass = PassiveAuxiliary ... 
data Cop = Copula ...
data Arg = Argument ...
data Agent = Agent ...

以及对应的实例

instance Subtype Aux where
  type SuperType Aux = Dep
  embedImmediate = ...

instance Subtype AuxPass where
  type SuperType AuxPass = Aux
  embedImmediate = ...

instance Subtype Cop where
  type SuperType Cop = Aux
  embedImmediate = ...

instance Subtype Arg where
  type SuperType Arg = Dep
  embedImmediate = ...

instance Subtype Agent where
  type SuperType Agent = Arg
  embedImmediate = ...

您如何填写...你决定。为此你可以做几件事:

  • 如果您的子类型在超类型之上添加了很多字段,那么只需添加一个具有超类型的字段即可embedImmediate返回该字段
  • 如果您的子类型仅添加几个字段,您可能需要手动解压它们。你的data定义看起来会更简洁,但是你的embedImmediate定义会有点长
  • 如果您的子类型没有向超类型添加任何字段,您可以创建一个newtype围绕超级类型和embedImmediate = coerce (from Data.Coerce)

那么,你不能quite只需在需要超类型的函数中使用子类型,但几乎:您只需添加对embed(不同于embedImmediate!)从子类型转换为所需的任何超类型(基于类型推断)。您可能想查看一些示例使用.

请注意,您现在可以使用<:作为约束:某物的类型是某物的子类型Aux,例如,是(a <: Aux) => a。每当你想要这个东西被视为Aux(或超类型Aux), call embed on it.

这种方法的一个很大的缺点是输入和输出类型必须被注释(否则不清楚which你想要的超类型embed进入,你会得到“模糊类型”错误)。如果您已经写了很多签名,那么应该没问题。

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

如何在 Haskell 中建模分层数据类型? 的相关文章

  • 为什么Haskell没有split函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在许多语言中 都有一个函数可以使用指定的分隔符将字符串分成几部分 它经常被称为split 您可以在 Python C Java JavaScri
  • 镜头中的观看和使用有什么区别?

    有什么区别 view MonadReader s m gt Getting a s a gt m a and use MonadState s m gt Getting a s a gt m a in 控制镜头吸气剂 https hacka
  • 绑定变量时 Haskell 中的无限循环

    下面的 Haskell 代码不会终止 有人可以解释一下为什么吗 谢谢 f let x 10 in let x x x in x 我认为解释器首先绑定 x 10 然后将 x x 计算为 100 并绑定 x 100 环境变为 x 100 那么整
  • Haskell:如何创建将函数应用于元组项的最通用函数

    这是一个个人练习 旨在更好地理解 Haskell 类型系统的局限性 我想创建最通用的函数 将某些函数应用于 2 条目元组中的每个条目 例如 applyToTuple fn a b fn a fn b 我试图让这个函数在以下每种情况下都起作用
  • 为什么这会导致 Haskell Conduit 库内存泄漏?

    我有一个conduit https hackage haskell org package conduit管道处理长文件 我想每 1000 条记录为用户打印一份进度报告 所以我这样写 Every n records perform the
  • 为什么 GeneralizedNewtypeDeriving 没有安全的 Haskell?

    来自 GHC 手册 第安全语言 http www haskell org ghc docs 7 6 2 html users guide safe haskell html safe language 模块边界控制 使用安全语言编译的 Ha
  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • Haskell 真的是纯粹的吗(有任何语言可以处理系统外的输入和输出)吗?

    在谈到函数式编程中的 Monad 后 该功能是否真的使语言变得纯粹 或者它只是黑板数学之外的现实世界中计算机系统推理的另一张 免狱卡 EDIT 这不是有人在这篇文章中所说的火焰诱饵 而是一个真正的问题 我希望有人能用它来击倒我并说 证明 它
  • 不同 hs 文件中的函数分离时堆栈空间溢出

    我有一个巨大的 haskell 文件 它编译和运行没有任何问题 我想将一些函数和类型定义放在通用 hs 文件中的单独模块中 然后将其导入我的主模块中 虽然主程序编译时没有任何错误 它还编译导入的模块 但当我尝试运行它时 出现堆栈空间溢出 I
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • Haskell 中的常量变量声明

    要声明常量变量 我可以在 Ruby 中执行以下操作 class COLOR RED 10 BLUE 20 GREEM 30 end COLOR RED回报10 COLOR BLUE回报20 等等 我如何在 Haskell 中实现这一点 我想
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • 计算两点之间的距离(Haskell)

    给定两个元组的输入 我希望能够使用以下公式计算两点之间的距离 距离 sqrt x1 x2 2 y1 y2 2 所以我希望函数调用和输出如下所示 gt distance 5 10 3 5 5 385 当我尝试运行下面的代码时 它告诉我输入 w
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 在 Haskell 命令行应用程序中提示输入密码

    以下 Haskell 程序提示用户在终端中输入密码 如果输入正确则继续 main do putStrLn Password password lt getLine case hash password member database of
  • 有没有办法在 Emacs 中使用 Djinn 自动生成 Haskell 代码?

    标题几乎说明了一切 我正在寻找这样的东西 f Int gt Bool gt Int f body Djinn 可以使用定理证明来通过证明该类型存在来生成此类函数的代码 我想知道 是否有现有的方法可以从 Emacs 中获取此功能 因此 我不需
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 如何使用 Haskell 提交 html 表单

    我知道如何使用http 管道 http hackage haskell org package http conduit 2 1 0包的 simplehttp 从 URL 检索页面 现在如果那样的话怎么办 网页有一个输入文本字段和一个提交按

随机推荐

  • 用 watir 检查标签类别?

    我有一个 div 它会根据表单是否正确提交而发生变化 我想知道是否可以检查类的特定元素 开始元素看起来像这样 div class input text div 如果输入不正确 请添加错误类别 div class input text err
  • iOS:在 ImageView 上绘制矩形并调整边框

    随附的1是一个名为 GeniusScan 的应用程序的屏幕截图 您可以在其中拍摄任何文档 并且图像视图上会显示可调整的矩形网格 您可以用手指轻松调整网格的边框 以选择要扫描的图像部分 然后它将转化为正确的预期 1 如何在图像视图上绘制网格并
  • ListView 中的空间超出了我的需要

    我使用 StackLayout 和 ListView 来显示视图的某些部分 但 ListView 占用的空间超出了我的需要 并且在列表的最后一行和配置文件延续之间留下了空白 看来我的 ListView 的行数比实际列表的长度多 或者它有固定
  • 如何在 swift 4 和 xcode 9 中的 UITableViewCell 中单击按钮时更新 UILabel? [复制]

    这个问题在这里已经有答案了 我正在构建一个订餐应用程序 其中有递增和递减按钮以及用于显示数量的 UILabel 我想更新单击增量和减量按钮时的数量标签 附有其图像 我的 ViewController 的一个片段是 protocol Gond
  • Java TimeZone.getTimeZone("PDT") 不工作

    它返回 GMT 的默认时区 使用 SimpleTimeFormat 并用 z 表示时区 它会打印 PDT 但 PDT 不在 TimeZone getAvailableIDs 返回的列表中 真是奇怪啊 有人知道为什么 PDT 不是标准 tz
  • 非聚集索引和聚集索引在同一列上

    我碰到this在 Stackoverflow 上发帖 第一个答案提到了类似的事情聚集索引包含表的所有数据 而非聚集索引仅包含列 聚集索引的位置或行 如果它位于堆上 没有聚集索引的表 非聚集索引怎么能有聚集索引的位置呢 它只包含在 B 树中排
  • 按列名称中的前缀排列列

    我有一个包含数百列的数据框 这是一个简化的示例 I need to arrange the order of specific columns so they are kept together based on the prefix in
  • 如何在 C# 中低延迟/极少延迟地播放音频文件?

    如何在 C 中以极小的延迟播放音频文件 mp3 我的意思是 文件应该在提供用户输入后立即开始播放 然后再播放 另外 如何同时并行播放两个音频文件 看看NAudio图书馆 要同时播放多个文件 请参阅这个帖子
  • 使用 JButton 将鼠标悬停在事件上

    我正在尝试在 JButton 上创建自定义鼠标悬停事件 原因是我的 JButton 当前是一个图像 所以我必须删除所有边框和动画等等 所以我这样做了 btnSinglePlayer setOpaque false btnSinglePlay
  • Spark 将隐藏参数添加到 Scala 类的构造函数中

    我不知道如何解释这一点 但 Spark 似乎向构造函数添加了一个隐藏 隐式 参数 这是我尝试过的代码spark shell 在常规 Scala shell 中参数列表将为空 scala gt class A defined class A
  • 使用 Rendertron 进行服务器端渲染 - 不带 firebase 的 Angular 5

    我使用 rendertron 作为服务器端渲染的解决方案 下面是 index js 文件 如何执行index js以及在哪里执行 我已经在我的服务器上使用 docker 设置了自己的 redertron 实例 并且我的角度应用程序构建位于
  • 将静脉坐标转换为 GPS

    我正在使用从以下位置导入的真实街道网络打开街道地图用于静脉模拟 例如卢森堡情景来自拉拉 科德卡 现在 为了准备可视化 使用 Google Earth 我想将模拟中的车辆位置从 SUMO 或 OmNET 坐标导出到 GPS 坐标 作为材料 我
  • 在多租户 Web 应用程序中使用事件委托

    我正在使用 asp net Mvc 5 开发一个多租户 n 层 Web 应用程序 在我的服务层中 我为每个重要操作定义自定义事件 并在执行这些操作后引发这些事件 例如 Public event EventHandler EntityCrea
  • Angular $resource.get 可以处理 GET 的数组和非数组吗?

    我可以通过两种方式通过 ID 获取 REST 资源 GET users 1 GET users 1 2 第一个返回单个对象 例如 id 1 name John 而第二个返回一个数组 例如 id 1 name John id 2 name J
  • 无法关闭 X 按钮上的多线程 Tkinter 应用程序

    我的应用程序具有以下结构 import tkinter as tk from threading import Thread class MyWindow tk Frame constructor methods etc def main
  • 不断上传 php $_FILES 错误 = 3(部分上传)

    我正在使用 Yii 框架的 dropzone 扩展来由注册用户上传一些文件 一切正常 但某些用户尝试上传的某些文件返回错误 3 当上传的文件仅部分上传时 就会发生这种情况 file error FILES Project error fil
  • 为什么某些 Typescript 模块名称以字符串形式给出?

    通常 Typescript 模块的声明如下 declare module MyModule 但有时我也看到它 declare module MyModule 我想知道将名称作为字符串给出的目的是什么 我检查了Typescript 文档并发现
  • 防止 WinForms PictureBox 动画 GIF 在处理过程中暂停?

    我有一个带有 2 个控件的表单 控件 1 有多个搜索条件 用户可以单击按钮开始搜索 Control 2 有一个将显示搜索结果的 GridView 还有一个带有动画 Gif 的 PictureBox 控制 1 中有一个方法 该方法有一个嵌套的
  • 如何使用 EF FromSql 编写 In 子句?

    我的条款有未知数量的参数 我该如何编写它才能与 EF Core 一起使用 var formattedValues String Join values Select s gt s var identifierParam new SqlPar
  • 如何在 Haskell 中建模分层数据类型?

    我有很多类型 它们的层次结构存储了一些有用的信息 我试图避免将类型层次结构的知识融入到对其进行操作的函数中 以下是斯坦福自然语言处理的类型依赖的一小段摘录 root root dep dependent aux auxiliary auxp