我一直在尝试使用Vinyl包,它使用类型级别来创建具有字段级别多态和自动提供的镜头的记录结构。这两个功能对我的项目非常有用,前者允许记录结构成为彼此的子类型而不会产生名称冲突,后者极大地简化了嵌套结构的更新。 问题出现在序列化结果结构上。通常,我使用Data.DeriveTH自动派生二进制实...
假设我有两个类型: t1 <- [t| (Functor f) => (a -> b) -> f a -> f b |] t2 <- [t| (Int -> Char) -> [Int] -> [Char] |] 在Template ...
假设我有这样的一个数据类型: data Color = Red | Blue | Green 我该如何使用模板哈斯克尔生成这样的函数? myShow Red = ... myShow Blue = ... myShow Green = ... 即,我正在寻找基于模式匹配的函数...
如果TH使用了副作用,那么有没有适当的方法使其函数更加安全?比如,我想要一个在编译时调用git并生成版本字符串的函数: {-# LANGUAGE TemplateHaskell #-} module Qq where import System.Process import Langua...
在 McBride 和 Paterson 的“应用程序编程与效果”中,他们介绍了一些美妙的语法糖,用于提升纯函数: (链接)。 [| f x y z |] 对于 f <$> x <*> y <*> z 我记得在其他地方有人使用li f w x ...
如您所知,模板 Haskell 用于在编译时以编程方式生成各种AST Splices。 然而,Splice 经常是非常不透明的,往往很难辨别 Splice 实际生成了什么。如果您对 Splice 运行 Q Monad,并且 Splice 是良好类型化的,那么您会得到一个可显示的 AST 生成...
我正在尝试使用 GHC 8 和 template-haskell-2.11 将一些代码的执行转移到编译时期。 代码看起来像这样: myThHelper :: FilePath -> Q Exp myThHelper path = runIO (compileThatFile pat...
我希望在我的Typed Template Haskell代码片段中使用typeclass约束,但是我无法让它们正常工作:splice内缺少实例。 这里有一个独立的、最小化的版本的代码来演示这个问题。第一个模块定义了一个Typed Template Haskell宏memoryMap,它不对t...
虽然我可以使用reify来获取大多数其他语法结构的信息,但我找不到任何可以提供有关模块信息的内容。
我希望能够使用Template Haskell在Q monad中处理状态。根据一些stackoverflow的答案,有一种解决方案是使用unsafePerformIO,但我想尽可能避免使用它。 我在模块Language.Haskell.TH.Syntax中找到了getQ和putQ函数。这些函...