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