在许多不同的数据中重复某个功能

2024-01-03

我正在用 Haskell 编写一个编译器,所以我们有一个lot (或者至少对我来说似乎很多) of datas 和构造函数,如下所示:

data DataType
    = Int | Float | Bool | Char | Range | Type
    | String Width
    | Record (Lexeme Identifier) (Seq Field) Width
    | Union  (Lexeme Identifier) (Seq Field) Width
    | Array   (Lexeme DataType) (Lexeme Expression) Width
    | UserDef (Lexeme Identifier)
    | Void | TypeError  -- For compiler use


data Statement
    -- Language
    = StNoop
    | StAssign (Lexeme Access) (Lexeme Expression)
    -- Definitions
    | StDeclaration      (Lexeme Declaration)
    | StDeclarationList  (DeclarationList Expression)
    | StStructDefinition (Lexeme DataType)
    -- Functions
    | StReturn        (Lexeme Expression)
    | StFunctionDef   (Lexeme Declaration) (Seq (Lexeme DataType))
    | StFunctionImp   (Lexeme Identifier)  (Seq (Lexeme Identifier)) StBlock
    | StProcedureCall (Lexeme Identifier)  (Seq (Lexeme Expression))
    -- I/O
    | StRead  (Seq (Lexeme Access))
    | StPrint (Seq (Lexeme Expression))
    -- Conditional
    | StIf   (Lexeme Expression) StBlock StBlock
    | StCase (Lexeme Expression) (Seq (Lexeme When))      StBlock
    -- Loops
    | StLoop     StBlock (Lexeme Expression) StBlock
    | StFor      (Lexeme Identifier) (Lexeme Expression)  StBlock
    | StBreak
    | StContinue

还有很多。您可能已经注意到重复的Lexeme a在许多构造函数中。

Lexeme 如下data

type Position = (Int, Int)

data Lexeme a = Lex
    { lexInfo :: a
    , lexPosn :: Position
    }

所以它的作用是保存信息Position中的一个元素的程序的文件,用于报告错误和警告。

有没有更简单的方法来处理保存信息的Position问题?


我习惯于看到另一个可以选择性地用来保存词汇信息的构造函数:

data Expression = ... all the old Exprs
                | ExprPos Position Expression

data Declaration = ... decls ...
                 | DeclPos Position Declaration

现在在你的Statement和其他数据类型而不是:

| StFor      (Lexeme Identifier) (Lexeme Expression)  StBlock

你有:

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

在许多不同的数据中重复某个功能 的相关文章

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

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 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
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 在另一个字符串中查找子字符串的索引 Haskell

    我要创建一个带有两个参数 字符串 的函数 该函数应查看第一个参数是否是第二个参数的子字符串 如果是这种情况 它将返回每个出现的元组 其中包含子字符串的起始索引和子字符串的结尾索引 例如 f String gt String gt Int I
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 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中用另一个字符串替换一个字符串

    我想用不同的字符串替换输入文件中的字符串 我正在寻找一种方法 但似乎我只能逐个字符地更改字符串 例如在我下面的代码中 replace String gt String replace replace x xs if x then y rep
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 使用带有两个列表而不是一个列表的地图。可以筑巢吗?

    我需要多次运行一个带有两个参数的函数 我有两个包含这些参数的列表 我希望能够使用map或类似的东西用相应的参数调用函数 我要调用的函数具有以下类型 runParseTest String gt String gt IO 列表的创建方式如下
  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • Haskell Fibonacci 达到最大指定数?

    我有一个已启动并正在运行的 Haskell 函数 但它做错了事情 它应该输出最多指定最大数量的斐波那契数列 像这样 fibonacciSequence 86 1 1 2 3 5 8 13 21 33 54 我的代码当前输出斐波那契数列中的前
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success

随机推荐

  • 采用 const 参数的默认移动构造函数

    定义类时 以下内容有效吗 T const T default 我正在阅读有关移动构造函数的内容here http en cppreference com w cpp language move constructor它解释了如何仍然可以隐式
  • 如何对守护程序进行内存检查?

    我编写了一个 C 应用程序 它会永远运行直到手动终止 它监视其他重要的应用程序 因此 我的守护进程应用程序不应停机 记住这一点 我想看看我的应用程序中是否存在内存泄漏 我使用了 valgrind 但由于该应用程序永远运行 因此 valgri
  • 将嵌套文件夹内容递归复制到一个文件夹(终端)

    我有一个 WordPress 上传文件夹 该文件夹使用子文件夹构建了几个月 wolfr2 uploads wolfr tree 2007 08 beautifulkatamari jpg beautifulkatamari thumbnai
  • boost::bind 何时将参数强制转换为所需类型?

    当我使用 boost bind 将参数绑定到函数时 它们何时被转换为函数所需的类型 如果可以隐式转换 它们如何存储在bind t对象中 作为最初传递给绑定的类型还是作为函数签名所需的类型 具体来说 如果我有签名的功能 void SomeFu
  • 如何使用 python 发送 AT GSM 命令?

    如何使用 python 发送 AT GSM 命令 我能够使用 Delphi 和一些 comport 组件 TComport 很容易地做到这一点 但是我如何使用 python 与我的调制解调器对话 Gath 我用 pyserial 这样做 i
  • 上传某些文件时$_FILES和$_POST数据为空

    我注意到 根据我上传的视频 有时整个 POST and FILES数组将为空 这是一个奇怪的现象 但我在一些视频中发现了它 为了测试 我使用的视频全部是video mp4文件类型
  • Cross-Origin Read Blocking (CORB) 阻止跨源

    Error 请求的资源上不存在 Access Control Allow Origin 标头 起源 https abcd com https abcd com 因此不允许访问 响应的 HTTP 状态代码为 403 每当我尝试从 Angula
  • 注销时不转到上一页

    我有一个jsp项目 我使用会话来获取用户权限 我用过 session invalidate 在注销页面中 注销后 当我按后退按钮时 它会显示上一页 我不希望它这样做 请在这件事上给予我帮助 您可以将 html 上的缓存设置为在注销确认页面上
  • 从字符串中获取转义的 unicode 代码

    我似乎遇到了与开发界其他人相反的问题 我需要从字符串生成转义字符 例如 假设我有这个词MESSAGE 我需要生成 u004D u0045 u0053 u0053 u0041 u0047 u0045 u003A u0053 u0069 u00
  • 查找 PostgreSQL 中不为 NULL 的列

    我为每个表分配了一个任务来计算可为空的列 简单的 SELECT table name count FROM INFORMATION SCHEMA COLUMNS WHERE is nullable NO GROUP BY table nam
  • 如何使用 SQLAlchemy 声明式创建复合列?

    我经常用Text保存 Markdown 格式的富文本的列 我的模型看起来像这样 class Document Base id Column Integer primary key True title Column Unicode 250
  • gzipped json 与高效二进制序列化的性能

    JSON 和 Gzip 是序列化数据的简单方法 这些在编程语言中广泛实现 而且这种表示形式可以跨系统移植 是吗 我的问题是 与非常高效的二进制序列化方法相比 json gzip 是否足够好 成本低于 2 倍 我正在寻找序列化各种数据时的空间
  • 未使用 v0 的“vperm v0,v0,v0,v17”有何作用?

    我正在研究一个SHA 256 实施 https github com noloader SHA Intrinsics blob master sha256 p8 cxx using Power8 内置 https github com no
  • 如何处理支持/设计库的新底页问题?

    背景 我使用了修改后的版本底页 https www google com design spec components bottom sheets html图书馆 here https github com AndroidDeveloper
  • Doxygen:如何记录 PHP 常量?

    如何记录 PHP 常量 define SOME CONSTANT constant value 与多氧 只需在常量上方包含一个文档块即可define 函数调用或const像这样的关键字
  • Access SQL 查询缺少更多必需参数

    在一个网络项目中 我尝试执行以下查询 SELECT ItemName as Name ItemPicture as Picture ItemHeroModif as Assistance ItemTroopModif as Charisma
  • 检测并防止/延迟Windows移动电源关闭

    我有一个窗口移动应用程序 需要在设备关闭之前检测电源关闭并执行一些操作 我已经能够使用 RequestPowerNotifications win32 api 的 pinvoke 检测到设备正在关闭 但是我不知道如何长时间关闭电源来运行我的
  • 如何将 Windows 网络路径与 Git Bash 结合使用

    网络资源的路径在 Windows 中用 servername share path to folder句法 如何在 Git Bash 中使用这样一个使用 Unix 风格路径的文件夹 其实只是cd servername share path
  • 有没有办法禁用所有这些到包目录的符号链接?

    我按照本指南使用 Dart Eclipse 插件 http blog dartwatch com 2013 01 integrating dart into eclipse and your html http blog dartwatch
  • 在许多不同的数据中重复某个功能

    我正在用 Haskell 编写一个编译器 所以我们有一个lot 或者至少对我来说似乎很多 of datas 和构造函数 如下所示 data DataType Int Float Bool Char Range Type String Wid