在 Haskell 中查找函数的行号

2024-01-24

我正在尝试创建一个 Haskell 程序,它将一些简单的 2d 形状绘制到屏幕上,但是当您将鼠标悬停在每个形状上时,它会打印创建该形状的源代码行。

为了做到这一点,我希望能够创建带有尺寸参数和指示行号的最终参数的形状。像这样的东西:

rect1 = Shape(Rectangle 2 2 lineNumber)

这将创建一个宽度为 2 像素、高度为 2 像素的矩形,并使用函数 lineNumber 来存储编写这段代码的行。 Haskell 中存在这样的函数吗?创建一个简单吗?

我搜索了堆栈溢出并发现这个问题 https://stackoverflow.com/questions/2314110/haskell-equivalent-of-cs-line其中回答者建议可以使用 C++ 中的 __LINE__ pragma 来实现类似的效果。这是最好的方法还是有办法在纯 Haskell 中做到这一点?


您可以使用 Template Haskell 来完成此操作,从技术上讲,它是另一个 GHC 扩展,但在某种程度上可能比 C 预处理器更“纯粹”。

代码被盗自here https://stackoverflow.com/questions/7073471/whats-the-correct-way-to-have-template-haskell-wrap-a-function-with-source-info并稍作修改。

{-# LANGUAGE TemplateHaskell #-}

module WithLocation (withLocation) where
import Language.Haskell.TH

withLocation' :: String -> IO a -> IO a
withLocation' s f = do { putStrLn s ; f }

withLocation :: Q Exp
withLocation = withFileLine [| withLocation' |]

withFileLine :: Q Exp -> Q Exp
withFileLine f = do
    let loc = fileLine =<< location
    appE f loc

fileLine :: Loc -> Q Exp
fileLine loc = do
    let floc = formatLoc loc
    [| $(litE $ stringL floc) |]

formatLoc :: Loc -> String
formatLoc loc = let file = loc_filename loc
                    (line, col) = loc_start loc
                in concat [file, ":", show line, ":", show col]

像这样使用它(来自另一个模块):

{-# LANGUAGE TemplateHaskell #-}

module Main where
import WithLocation

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

在 Haskell 中查找函数的行号 的相关文章

  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • 警告:格式“%d”需要类型“int *”,但参数 2 的类型为“int”

    所以我是 C 的新手 并且对这个警告发生的情况遇到了麻烦 该警告是什么意思以及我该如何解决它 我写的代码在这里 void main void char name int age 0 printf input your name n scan
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 将两个 Int 值相除以获得 Float 的正确方法是什么?

    我想分两份IntHaskell 中的值并获得结果Float 我尝试这样做 foo Int gt Int gt Float foo a b fromRational a b 但 GHC 版本 6 12 1 告诉我 无法将预期类型 Intege
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Haskell 泛化问题(涉及列表理解)

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

    我正在玩一些汇编代码 有些事情困扰着我 我编译这个 include
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • dart javascript 编译器 (dart2js) 如何工作?

    Dart 在其自己的 Dart VM 中运行 但您可以将其编译为现代优化的 JavaScript 但这是如何运作的呢 网上有任何文章或论文解释该过程吗 我想知道这是否是一个简单直接的元素与元素匹配 仅耗时开发 处理 或者 Dart 的某些元
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Paper.js 中的事件处理程序

    我是 Paper js 的新手 在阅读教程时我对事件系统感到好奇 这就是事件处理中描述的方式tutorial http paperjs org tutorials interaction mouse tool events var path
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 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
  • 可以读取目标文件吗?

    我很好奇 obj文件 我几乎不知道它们是什么 或者它们包含什么 所以我用 Vim 文本编辑器打开它们 我在里面发现了一种类似外星人的语言 有什么办法可以理解它们代表什么以及它们的内容是什么 另外 它们的用途是什么 Thanks Sure 但

随机推荐

  • Java构建时间常数配置

    我有一个项目想使用多种配置来构建 我有一个常量需要在构建之间有所不同 但我不知道如何根据我的配置更改它 例如 我希望能够根据配置文件中的值执行以下操作 WebService targetNamespace http example com
  • 在 PHP 中获取浮点数的小数部分的最佳方法是什么?

    在 PHP 中如何找到浮点数的小数部分 例如 如果我有值1 25 我想回来0 25 x x floor x
  • C:表示不带浮点数的分数

    我正在为没有硬件浮点支持的嵌入式系统 MSP430 编写一些代码 不幸的是 当我进行测距时 我需要在代码中使用分数 而精度为 1m 的短程传感器并不是一个很好的传感器 我可以用整数进行尽可能多的数学运算 但到最后 我肯定需要对两个值进行分数
  • 使用 iOS 模块构建 Native View 并在 Titanium 中使用它们

    我想构建一个 iOS 模块 其中有一个 viewController 类及其 xib 文件 现在的问题是如何从我的钛代码中调用该视图 我知道有可用的视图代理 但由于文档不太好 不知道如何使用它们 到目前为止 我已经创建了一个可以传递非图形数
  • 如何从 PHP 中的日期时间戳获取时间和日期?

    我有一根像8 29 2011 11 16 12 AM 我想保存在变量中 例如 dat 8 29 2011 and tme 11 16 12 AM 如何实现这一目标 你能举个例子吗 E g
  • 无法向 Google 电子表格添加行

    我可以打开工作表并从标题中读取单元格 Google 电子表格中的第一行是标题 我已在 Google 电子表格中手动添加了 Name my val1 my val2 my val3 Other 这是相关的谷歌文档 https develope
  • 从 git svn clone 中排除文件

    我正在将 SVN 存储库迁移到 Git 并且我有 7000 多个二进制文件 我希望从一开始就将它们排除在导入之外并成为 Git 历史记录的一部分 而不是在之后清理它们 参考此question https stackoverflow com
  • 如何将元组的元组转换为其元素的计数?

    我有这个tuple元组 TupleOfTuples Venue1 Name1 Venue1 Name2 Venue2 Name3 Venue3 Name4 Venue3 Name5 Venue3 Name6 我想将其转换以获得如下结果 Ou
  • 如何在 WPF 中使用线程的结果?

    不幸的是 线程和任务对我来说是一个很大的谜 必须在与 DependencyObject 相同的线程上创建 DependencySource 我正在努力避免用户界面冻结 我的方法是在线程中完成工作 然后使用线程的输出设置属性 我有一个基类Jo
  • 重新选择 - 调用另一个选择器的选择器?

    我有一个选择器 const someSelector createSelector getUserIdsSelector ids gt ids map id gt yetAnotherSelector store id yetAnother
  • 克服公共项目的 GitHub API 速率限制?

    我有一个公共存储库 它是 Ansible 角色 此 Ansible 角色使用 GitHub API 来获取给定存储库的最新版本 我使用此元数据以便随后下载给定项目的最新版本二进制文件 不幸的是 当我在 Travis 中运行测试并偶尔在本地计
  • C:数组初始化段错误取决于大小和对 printf() 的调用

    另一个学生问我他的 C 代码有什么问题 我成功地重现了错误的行为 并且完全不知道为什么会出现段错误 考虑这个小小的 C 程序 include
  • 如何在 SwiftUI 中将 .enumerated() 与 ForEach 一起使用?

    这是一个按预期工作的简单 SwiftUI 列表 struct App View let items Array 100 200 var body some View List ForEach items id self index item
  • NSURLCache 在启动时是否持久?

    我正在为我的 iOS 应用程序寻找一种在启动后保持不变的网络缓存解决方案 我开始阅读有关 NSURLCache 的内容 但没有看到任何有关持久性的提及 有谁知道当您使用 NSURLCache 然后关闭并打开应用程序时它的行为如何 它持续吗
  • Phonegap 非调试模式和使用许可证密钥签名

    我已经在phonegap 中完成了一个应用程序 并想在谷歌应用程序商店上发布它 每次我下载 apk 文件时 它都处于调试模式 我如何使用密钥或密钥库对其进行签名 以将其上传到 Google Play 因为 Google 不会在调试模式下将其
  • 如何将道具从模板传递到反应根节点?

    我已经成功地在模板上的 div 上渲染我的组件 如下所示 索引 html load render bundle from webpack loader h1 Example h1 div div render bundle main 我的反
  • Objective-C:检查 OSX 中的防火墙状态?

    我的 Objective C 应用程序需要知道 OSX 中的防火墙是否正在运行 以便它可以告诉用户将其关闭或创建新规则 另外 是否可以直接从我的应用程序创建规则 以便用户永远不需要处理网络问题 John 我正在编写一个函数 可以为您提供 O
  • 为什么我无法从 Firebase 实时数据库检索用户名和密码

    我想使用存储在 Firebase 实时数据库中的用户名和密码登录 但我的代码不起作用 我包括我的数据库图片和代码 请帮我 这是数据库图像 这是我的主要活动代码MainActivity java databaseReference Fireb
  • jQuery 中有样式选择器吗?

    例如 如果我想选择它的 alt 是 Home 的每个图像 我可以执行以下操作 img alt Home 但是我怎样才能选择它们的每个元素width例如 在单个选择器中 CSS 属性为 750px EDIT 如果没有这样的选择器 是否有任何插
  • 在 Haskell 中查找函数的行号

    我正在尝试创建一个 Haskell 程序 它将一些简单的 2d 形状绘制到屏幕上 但是当您将鼠标悬停在每个形状上时 它会打印创建该形状的源代码行 为了做到这一点 我希望能够创建带有尺寸参数和指示行号的最终参数的形状 像这样的东西 rect1