【问题标题】:Testing Template Haskell with mkName使用 mkName 测试模板 Haskell
【发布时间】:2015-02-16 15:53:52
【问题描述】:

我有一个函数可以返回动态绑定的Type——本质上是ConT $ mkName "MyType"。当然,实际功能要复杂得多,足以让我想为它编写测试,最好是易读的。但以下:

import Language.Haskell.TH
import MyTypeModule (MyType)

myFn :: Type    
myFn = ConT $ mkName "MyType"

test = ... $ do
  m <- runQ [t| MyType |]
  myFn `shouldBe` m

总是会失败,因为m 将解析为ConT MyTypeModule.MyType 而不是ConT MyType

有没有一种很好的方法可以将myFn 类型转换为完全限定的类型,或者检查mmyFn 是否相同(在当前上下文中)?

【问题讨论】:

  • 我认为在这里做的最简单的事情是编写一个自定义的== 函数,它比较Names 以使引用的名称和未引用的名称相等。这与从两种类型中剥离模块限定符并​​正常比较它们相同。

标签: haskell template-haskell


【解决方案1】:

哇,好久没有答案了,但在互联网上发布答案永远不会太晚!

myFn = ConT ''MyType

使用 -XTemplateHaskell 语言扩展启用刻度,并在此处记录:

https://hackage.haskell.org/package/template-haskell-2.13.0.0/docs/Language-Haskell-TH-Syntax.html#t:Name

【讨论】:

  • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2012-08-11
相关资源
最近更新 更多