Haskell 如何在接受类型的函数中为Int创建模式匹配?

Haskell 如何在接受类型的函数中为Int创建模式匹配?,haskell,template-haskell,Haskell,Template Haskell,我有一个采用类型的函数: data MyType = IntT | BoolT | OtherT typeToMyType :: Type -> MyType 我如何编写一个模式来声明我想要匹配Int的类型 我试过什么? 1. [t | GHC.Types.Int |]将创建类型Q type的值,但尽管经过数小时的努力,我还是无法强制进行模式匹配拼接 我也试着在守卫中使用它: | $( do tI <- [t| GHC.Types.Int |]; [| t == tI |] )

我有一个采用
类型的函数

data MyType = IntT | BoolT | OtherT

typeToMyType :: Type -> MyType
我如何编写一个模式来声明我想要匹配
Int
的类型

我试过什么? 1.
[t | GHC.Types.Int |]
将创建类型
Q type
的值,但尽管经过数小时的努力,我还是无法强制进行模式匹配拼接

我也试着在守卫中使用它:

| $( do tI <- [t| GHC.Types.Int |]; [| t == tI |] ) = ...
但是:

Couldn't match type `Name' with `Q Pat'
Expected type: PatQ
  Actual type: Name
In the expression: ''Int
In the splice: $(''Int)
我不知道那是什么意思

我(甚至)需要它做什么? 我想“解析”一个函数签名来创建一个
qdec
。我使用了
String
作为原型:

    gen ["Int", "Int"] "luaOpMinus" '-
  ======>
    Eval.hs:24:3-38
    luaOpMinus [Number x_a98F, Number x_a98G]
      = (return $ [Number ((-) x_a98F x_a98G)])
如您所见,它将一个用值
[“Int”,“Int”]
注释的函数
Int->Int->Int
(我现在省略了返回类型)转换为一个函数
[LuaValue]->LuaValue
,以便可以轻松地从Lua调用它。但是,手工输入签名很乏味,所以我想从
reify
中提取出来

问题是,虽然我可以清楚地阅读
具体化
给我的信息:

Prelude Language.Haskell.TH Data.Bits> $(reify 'bit >>= stringE . show)
"ClassOpI Data.Bits.bit (ForallT [PlainTV a_1627400821] [ClassP Data.Bits.Bits [VarT a_1627400821]] (AppT (AppT
ArrowT (ConT GHC.Types.Int)) (VarT a_1627400821))) Data.Bits.Bits (Fixity 9 InfixL)"
我无法编写
(ConT GHC.Types.Int)
模式

您不需要
$(…)
,因为
''Int
已经有了类型
Name

typeToMyType :: Type -> MyType
typeToMyType (ConT t) | t == ''Int  = IntT
                      | t == ''Bool = BoolT
typeToMyType _ = OtherT
由于某些原因,GHC不喜欢模式中的
'Int
语法,因此我不得不将其移动到模式保护中。

可能相关:
'Int
不是模式语法,因此如果它出现在模式中,编译器自然会抱怨。
Prelude Language.Haskell.TH Data.Bits> $(reify 'bit >>= stringE . show)
"ClassOpI Data.Bits.bit (ForallT [PlainTV a_1627400821] [ClassP Data.Bits.Bits [VarT a_1627400821]] (AppT (AppT
ArrowT (ConT GHC.Types.Int)) (VarT a_1627400821))) Data.Bits.Bits (Fixity 9 InfixL)"
typeToMyType :: Type -> MyType
typeToMyType (ConT $(''Int)) = NumberT 
typeToMyType :: Type -> MyType
typeToMyType (ConT t) | t == ''Int  = IntT
                      | t == ''Bool = BoolT
typeToMyType _ = OtherT