2015-11-01 56 views
2

如何查找类型运算符名称?这不起作用:模板Haskell - 如何查找类型运算符名称?

IssueTH.hs:

{-# LANGUAGE TemplateHaskell #-} 
module IssueTH where 
import Language.Haskell.TH 

f :: Q [Dec] 
f = do 
    Just n <- lookupTypeName "GHC.TypeLits.*" 
    return [] 

Issue.hs:

{-# LANGUAGE TemplateHaskell #-} 
module Issue where 
import IssueTH 

$f 

ghc Issue.hs失败消息:

Pattern match failure in do expression at IssueTH.hs 

"GHC.TypeLits.(*)""*"没有按更换"GHC.TypeLits.*"也不行。

+0

1.您在第二个文件中缺少'import GHC.TypeLits',即使使用非运算符类型也不行。修复后,这仍然看起来像一个错误,所以我[报告](https://ghc.haskell.org/trac/ghc/ticket/11046#ticket)。 –

+0

我[刚刚发现](https://ghc.haskell.org/trac/ghc/ticket/11046#comment:1),它适用于类型操作符以':'开头,所以我的猜测是函数wasn'当他们的语法被放开时,t更新。 –

+0

@ØrjanJohansen,我查找完全限定的“GHC.TypeLits。*”,我不认为我需要导入GHC.TypeLits,但它仍然无法正常工作,如您所见。 –

回答

3

我想我现在有足够的时间做一个简短的回答。唉,我只找到你的问题的原因,但没有如何解决它。

我的测试显示,lookupTypeName确实是支持类型运算符,但前提是它们以:开头。

最初这是一个要求,类似于中缀数据构造函数,但是这被提升以允许诸如GHC.TypeLits中的算术类型运算符之类的东西。 (缺点是,你可以不再有类型的操作变量,因为是搞什么Arrow代码一度流行。)

大概lookupTypeName没有更新,考虑到这一点,我有filed a bug report这一点。

编辑:这个问题的解决方案已经终于完成了,应该在即将到来的GHC 8.2.1中。