模板 Haskell - 如何查找类型运算符名称?

Template Haskell - How to lookup type operator name?

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

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.*" 也不起作用。

我想我现在已经有足够的时间来做一个简短的回答了。唉,我只找到了你问题的原因,却没有找到解决方法

我的测试表明 lookupTypeName 确实 支持类型运算符,但前提是它们以 :.

开头

最初这是一项要求,类似于中缀数据构造函数,但后来取消了这一要求以允许 GHC.TypeLits 中的算术类型运算符。 (缺点是您不能再使用类型运算符 变量 ,因为曾经流行 Arrow 代码。)

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

编辑:终于解决了这个问题,应该在即将发布的 GHC 8.2.1 中。