问题标签 [template-haskell]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell-platform - Haskell 中的有向图
我现在正在与 Haskell 斗争。甚至,我对命令式语言和 OOP 有一些经验,但 Haskell 似乎与它们不同。我低估了 Haskell,并认为学习一门新语言对我来说不是问题。然而,在花了整整一周的时间学习许多新概念(typeclass、functors、applicative、monoids、monads...阅读了这个learnyouahaskell的所有 14 章)之后,我注意到它们让我很困惑,不知道如何开始写作Haskell 的一个程序。一些专家说你需要几个月的时间才能掌握 Haskell。但我只有两周的时间来完成一个大项目。
1)所以我的第一个问题是如何学习 Haskell
2)什么时候需要使用应用函子,什么时候需要使用单子?
3)我的项目是处理基于许多演示的有向图:
- 邻接矩阵
- 二叉搜索树
我是一个 Haskell 新手,所以不知道在 Haskell 中我可以从哪里开始有向图?你有什么建议吗?
haskell - Haskell:我想我真的可以在这里使用类似 Lisp 的宏
我的小足球比赛的 AI 代码基本上是这样工作的:有一个函数可以得出描述球场当前情况的事实:
...事实看起来像这样:
...并且有些规则看起来像这样:
然后有一个规则引擎运行所有规则并收集结果消息。
到目前为止还不错,而且效果很好。不过,有什么烦人的:在这种方法中,我需要一个像这样的“访问器”函数来处理每个事实:
这种方法会导致很多丑陋的样板代码。我的问题:是否有一个优雅的解决方案可以消除手动创建这些访问器函数的需要?
optimization - 循环和递归展开
这是来自 SHA-1 标准。在 haskell 中,您要做的就是编写一个递归函数来执行此操作,但为了提高效率,我想展开整个递归。内联不起作用,因为这可能导致代码呈指数级增长。我的想法是编写 TH 来生成常量行W_0
,W_1
等等W_2
。W_79
另一个例子是for循环展开的情况
我也想展开这个循环以避免递归函数调用(而且我认为 ghc 不会执行这种优化)。
所以在我为此写 TH 之前,我想问一下是否有更好的方法来做这件事。只是说优化在这里非常关键。
haskell - 如何将 HamletSettings 应用于 Hamlet 中的 quasiquote?
背景:我正在研究哈姆雷特是如何工作的,有 WAI,但没有 Yesod。我没有掌握模板 Haskell,但在我深入研究它之前,我想知道是否有一个已知/快速的解决方案来完成这项任务。
细节:我想知道如何在 Hamlet quasiquote 的上下文中更改NewlineStyle。
探索:我相信这与看起来像这样的函数调用有关
...但是,在准引用的上下文中,我不知道如何编写执行此操作的代码。
这是我希望修改的工作代码:
提前感谢您的任何帮助、侮辱或其他评论。
haskell - 为什么 Template Haskell 在编译期间允许任意 IO 操作?
当我试图了解 TH 时,我发现它允许IO
在编译期间进行任意操作(请参阅Template Haskell 有什么不好?)。这对我来说似乎很危险。这是为什么?某些任务真的有必要吗?还是只是对其设计的简化,“把不纯的东西都扔进IO
罪仓”?
更新:如果有任何努力制作一个不允许任意操作的 TH安全子集,我也会感兴趣。IO
haskell - 如何使用 Template Haskell 获取函数体?
目前,我正在尝试从 Haskell 子集进行翻译,而无需处理所有解析、类型检查等问题。文档并没有帮助我找出一个函数来通过其名称获取函数的主体(所有定义)。
此调用的上下文应类似于
有谁知道
- TH 上是否有一些好的和最新的文档(不是 Hackage 上的参考)或
- 如何制作getBody?
haskell - 有没有一种方法可以使用 Derive 和 Template Haskell 或其他方式为 Vinyl 记录类型派生二进制实例
我一直在试用Vinyl 包,它使用类型级别的种类来创建具有字段级别多态性和自动提供镜头的记录结构。这两个功能对我的项目来说都非常方便,因为前者允许记录结构是彼此的子类型而不会发生名称冲突,而后者则大大简化了嵌套结构的更新。
问题来自序列化结果结构。通常我使用 Data.DeriveTH 自动派生 Binary 实例,但它似乎无法处理这些结构。以下代码
导致 GHCI 中出现此错误
这似乎与 Derive Convert 模块中的这段代码有关:
现在我真的不知道如何阅读 Template Haskell,所以我在这里无法取得太大进展。我突然想到,我提供的是类型同义词而不是数据类型,这可能会破坏它,所以我尝试将它包装在一个新类型中:
这导致了这个更加迟钝的错误:
查看 Convert.hs 我们有
现在我猜测问题出在 GHC 7.6 引入了 Derive 模板 Haskell 没有考虑到的新语言结构,从而导致了非详尽的模式。
所以我的问题是,是否有一些方法可以通过添加到 Derive 或从 Vinyl 记录类型编写我自己的派生,或类似的东西?如果乙烯基的好处不得不与手写所有序列化进行权衡,那将是一种耻辱。
haskell - 模板元编程的 Haskell 变体
我是 Haskell 的新手。鉴于 Haskell 的整个前提是函数将始终返回相同的值,我希望有一些方法可以在编译时计算常量的斐波那契值,就像我可以在 C++ 中使用模板元编程一样,但我可以不知道怎么做。有办法吗?
haskell-platform - Haskell 类型表达式
我有两个关于 Haskell 类型表达式的问题:
问题 1 -
我想声明一个类型 NODE
一个类型 ATTR 包含 3 个子类型,如下所示:
源布尔
目标布尔
幽灵诠释
但上述声明不满足 ATTR 可以包含任何子类型组合的要求,例如:
- ATTR 可以同时包含 Source Bool 和 Target Bool
- ATTR 可以同时包含 Source Bool、Target Bool 和 Ghost Int
- ATTR 甚至可以为空(不包含任何内容)
问题2 -
我想声明一个类型 GRAPH,其中一个图形可以包含 1 个或多个语句 (STMTS),如果图形为空,则不包含任何语句。所以我声明如下:
但同样,正如您所见,递归数据类型 STMTS 将无限重复。
haskell-platform - 数据类型 Haskell 错误
我声明一些数据类型如下:
现在我写一些函数返回它们的数据类型:
函数 funcTX_TY 将 TX 的值与 4 进行比较,返回一个 TX_OR_TY 类型,如果较大则返回 TX,如果较小则返回 TY。但是在编译时,它宣布它无法将预期的类型TX_OR_TY与TX匹配。我该如何解决?