如何检查 Template Haskell 中引用的数据构造函数名称?

2023-12-09

我正在尝试学习一些 Haskell 模板。作为练习,我编写了一个可以生成类似内容的函数isLeft and isRight(灵感来自这个问题)。这是我的卑微尝试:

isA connam = do
    ConE nam <- connam
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (conP nam [wildP]) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]

问题是它只适用于单参数构造函数。罪魁祸首是conP nam [wildP]图案。理想情况下,它应该看起来像conP nam (replicate (numArgs nam) wildP), where numArgs是一个返回构造函数参数数量的函数。但我该如何编写这样的函数呢?我想我需要访问相关的数据声明,但我不知道如何访问。

关于这个相同的功能还有另一个问题here.


虽然你可以使用reify并检查类型以确定数据构造函数的数量,使用记录模式生成与数量无关的代码要容易得多:

isFoo :: Bar -> Bool
isFoo p = case p of
    (Foo {}) -> True     -- Valid no matter what the arity of Foo is
    _        -> False

这可以通过替换来完成conP with recP在你的代码中。

isA connam = do
    ConE nam <- connam
    nn <- newName "p"
    lamE [varP nn] $ caseE (varE nn) [
                       match (recP nam []) ( normalB [| True |] ) [],
                       match wildP ( normalB [| False |] ) [] 
                     ]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 Template Haskell 中引用的数据构造函数名称? 的相关文章

  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 这个实例有什么问题:ArrowApply Automaton?

    我希望 Automaton 有实例 ArrowApply 但 Control Arrow Transformer Automaton 没有 我认为下面的代码会表现良好 data Automaton b c Auto runAuto b gt
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 在 Haskell 中调试时打印时间戳

    我仍在学习 Haskell 并调试一些函数 并且通常有一个时间戳函数来了解某些操作何时开始和停止 doSomeAction String gt IO doSomeAction arg1 do putStrLn lt lt makeTime
  • Cabal:使用源代码构建目录

    我有一个src目录 在这个目录中我有Main hs文件和Test目录 在里面Test我有的目录Test hs模块 我需要用 cabal 来编译它 在我的阴谋集团文件中 我有 Executable main hs or lhs file co
  • 当约束成立时,将没有约束的 GADT 转换为另一个有约束的 GADT

    我们能否将构造函数没有给定约束的 GADT 转换为具有上述约束的 GADT 我想这样做是因为我想要深度嵌入箭头并用 目前 似乎需要的表示做一些有趣的事情Typeable 一个理由 https stackoverflow com a 1223
  • 为什么对本地列表求和比用“GHC -O2”对教会编码列表求和慢?

    为了测试教会编码的列表如何针对用户定义的列表和本机列表执行 我准备了 3 个基准测试 用户定义的列表 data List a Cons a List a Nil deriving Show lenumTil n go n Nil where
  • 告诉阴谋集团主模块在哪里

    我有一个具有以下结构的项目 foo cabal src Foo Main hs foo cabal 的一部分如下所示 executable foo main is Foo Main hs hs source dirs src Main hs
  • kind 类型的函子和应用词 (* -> *) -> *

    我遇到了一种情况 我的代码将受益于使用Functor and Applicative 类似抽象 但针对种类类型 gt gt 定义一个更高种类的函子可以通过RankNTypes像这样 class HFunctor f where hfmap
  • 我可以在线性时间内检查有界列表是否包含重复项吗?

    假设我有一个Int列表 其中元素已知是有界的 并且列表已知不长于它们的范围 因此它完全有可能不包含重复项 如何才能最快地测试是否是这种情况 我知道nubOrd https hackage haskell org package contai
  • 在 Haskell 中证明“没有腐败”

    我所在的行业对安全要求很高 我们的软件项目一般都会有安全要求 我们必须证明该软件具有高度确定性 通常这些都是负面的 例如 腐败的频率不得超过 1 我要补充的是 这些要求来自统计系统安全要求 损坏的根源之一显然是编码错误 我想使用 Haske
  • Haskell 中动态规划的高效表

    我已经编码了0 1背包问题 http en wikipedia org wiki Knapsack problem 0 1 knapsack problem在哈斯克尔 我对迄今为止所取得的懒惰和普遍性水平感到相当自豪 我首先提供用于创建和处
  • 结构上强制的自由替代,没有左派分配性

    有一个不错的免费替代品 http hackage haskell org package free 4 12 4 docs Control Alternative Free html在伟大的free包 它将函子提升到左分配替代方案 也就是说
  • 为什么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
  • yesod——密码保护临时站点

    我正在尝试设置 yesod 网络服务器的临时实例 我想知道是否有一些简单的方法可以使整个站点受到密码保护 具体来说 我希望能够提示那些导航到我的网站的人提供凭据 经过身份验证后 它应该像典型站点一样运行 但如果他们无法验证自己的身份 他们就

随机推荐

  • 在symfony2中引用静态模板

    我想将 Angular 与 symfony2 一起使用 为此 应该可以从像这样的引用加载模板 div div 载荷是角度的部分 我们只需提供模板的路径即可 模板不应该用树枝渲染 这可以用 symfony 实现吗 简单地制作一个没有树枝标签的
  • PDF 中的统一码

    我的程序根据要求生成相对简单的 PDF 文档 但我在处理 unicode 字符 如汉字或奇怪的数学符号 时遇到问题 要在 PDF 中写入普通字符串 请将其放在括号中 something 还可以选择使用八进制代码转义字符 527 但这最多只能
  • 使用PHP代码从多维数组获取数据

    我正在尝试获取这些数据 label gt For Rent来自多维数组 这是我的数组 Array listing id gt 0 fields gt Array 1 gt Property House 7 2 gt 30 4 gt sdfa
  • 停止预定的 JavaScript 执行

    我有一个函数 在其中定义了很多 setTimeout 函数 当用户按下按钮时 它就开始执行 我怎样才能取消它 有什么方法可以取消所有超时 假设我有多个没有名字的超时 start timer var timer setTimeout canc
  • Expressjs+socket.io+express-session

    我的 server js 中有这段代码 var app require express session require express session cookie require cookie cookieParser require c
  • 本体中实体的排序

    我有一个系统 可以在本体 通常的三重存储 中对一些领域数据进行建模 我一直在寻找一种表达复数和排序的方法 但没有通过谷歌找到任何东西 我的主要用例是 域中的一个实体可以是一系列任务 买杂货 做饭 吃饭等 但总的来说 我觉得有能力 衡量 你的
  • 此 python 代码是否使用深度优先搜索 (DFS) 来查找所有路径?

    这段代码给出在python图论官方论文 这是代码 def find all paths graph start end path path path start if start end return path if not graph h
  • rake db:migrate (mysql) [重复]

    这个问题在这里已经有答案了 可能的重复 库未加载 尝试使用 mysql2 gem 在 OS X 10 6 上运行 rails server 时出现 libmysqlclient 16 dylib 错误 为什么我收到这个错误 什么意思 我已经
  • 如何获得数组中高于某个数字的最小值?

    我有一个像这样的数组 5229561 gt 8 5229582 gt 9 5229583 gt 10 5229584 gt 11 如果数组已排序并且键是连续的 例如 100 101 102 没有 78 5 13 则可以使用二分搜索 总的来说
  • 如何以另一种形式调用PHP中的函数?

    我有一个带有名字的页面1 php里面有一个功能 现在我想调用该函数2 php在 PHP 2 中 我写了func 这个函数在1 php 但它有这个错误 Fatal error Call to undefined function func i
  • 如何以编程方式在 Selenium Jupiter 的基类中配置 WebDriver?

    我想将基于 JUnit 4 的现有 Selenium 测试迁移到 JUnit 5 为此 我想利用硒 木星 测试必须满足的一项要求是 能够在运行时切换 WebDriver 实现 基于执行环境 使用所有测试的一个公共基类 在开发人员计算机 Wi
  • Eclipselink 支持包含正则表达式的查询吗?

    我已经看到像 MySQL 这样的 DBMS 支持包含正则表达式的查询 Eclipselink 支持这个吗 我必须检索具有与某些正则表达式匹配的某些字符串属性的实体 SELECT X FROM Person X WHERE X name
  • Phoenix.ActionClauseError at POST,没有匹配的操作子句来处理请求

    每当我发布到 api subastas 时 我都会收到此错误 Phoenix ActionClauseError at POST api subastas bad request to IascSubastas SubastaControl
  • 将 Python 列表和字典理解与计数器结合起来

    我想传输元组列表 1 3 5 2 4 6 7 8 9 到一个列表dict 为了创建一个 pandas 数据框 如下所示 index 1 match 1 index 1 match 3 index 1 match 5 index 2 matc
  • Android上从网页启动流媒体音频播放器的方法

    要链接到 SHOUTcast HTTP 互联网广播流 传统上您会链接到播放列表文件 例如 M3U 或 PLS 从那里 浏览器将启动注册来处理播放列表的音频播放器 这适用于任何 PC Palm Blackberry 和 iPhone 这个方法
  • 如何在对数图中设置双轴刻度

    在我的图中 辅助 x 轴用于显示某些数据的另一个变量的值 现在 原始轴已按对数缩放 不幸的是 孪生轴将刻度 和标签 放置在原始轴的线性刻度上 而不是按照对数刻度 如何克服这个问题 这里的代码示例应该将孪生轴的刻度放在与原始轴相同的 绝对轴
  • 如何使 scanf 有选择地忽略其转换说明符之一?

    char value1 10 int value2 int value3 0 if scanf s d d value1 0 value2 value3 scanf s d value1 0 value2 我正在尝试使用scanf插入 3
  • 使用zxing进行QR码编码和解码

    好吧 所以我要打消这里有人以前使用过 zxing 的可能性 我正在开发一个Java应用程序 它需要做的一件事是将数据的字节数组编码为QR码 然后稍后对其进行解码 这是我的编码器的示例 byte b 0x48 0x45 0x4C 0x4C 0
  • 检查值是否存在于多维数组java中

    没有for loop 有什么方法可以查看 a 中是否存在某个值multidimensional array 我发现 Arrays asList ArrayName contains itemToFind 但这只会搜索数组的第一个维度 而我需
  • 如何检查 Template Haskell 中引用的数据构造函数名称?

    我正在尝试学习一些 Haskell 模板 作为练习 我编写了一个可以生成类似内容的函数isLeft and isRight 灵感来自这个问题 这是我的卑微尝试 isA connam do ConE nam lt connam nn lt n