模板 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 中。
如何查找类型运算符名称?这不起作用:
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 中。