gpt4 book ai didi

haskell - 如何在采用 Type 的函数中为 Int 创建模式匹配?

转载 作者:行者123 更新时间:2023-12-01 03:37:45 24 4
gpt4 key购买 nike

我有一个函数需要 Type :

data MyType = IntT | BoolT | OtherT

typeToMyType :: Type -> MyType

如何编写一个模式来说明我想匹配 Int 的类型?

我尝试了什么?

1
[t| GHC.Types.Int |]将创建一个 Q Type 类型的值,但尽管挣扎了几个小时,我还是无法强制进行模式匹配拼接。

我也尝试在 guard 中使用它:
| $( do tI <- [t| GHC.Types.Int |]; [| t == tI |] ) = ...

但这提示:
No instance for (Language.Haskell.TH.Syntax.Lift Type)
arising from a use of `Language.Haskell.TH.Syntax.lift'
In the expression: Language.Haskell.TH.Syntax.lift tI
In a stmt of a 'do' block:
[| t == tI |]
pending(rn) [tI]
In the expression:
do { tI <- [t| Int |];
[| t == tI |]
pending(rn) [tI] }

2

一种可能更简单的方法是:
typeToMyType :: Type -> MyType
typeToMyType (ConT $(''Int)) = NumberT

但是之后:
Couldn't match type `Name' with `Q Pat'
Expected type: PatQ
Actual type: Name
In the expression: ''Int
In the splice: $(''Int)

我不知道那是什么意思。

我(甚至)需要它做什么?

我想“解析”一个函数签名来创建一个 Q Dec .我用过 String对于原型(prototype):
    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 中提取它。 .

问题是虽然我可以阅读 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) 图案。

最佳答案

typeToMyType :: Type -> MyType
typeToMyType (ConT $(''Int)) = NumberT


您不需要 $(...) , 自 ''Int已经有类型 Name .
typeToMyType :: Type -> MyType
typeToMyType (ConT t) | t == ''Int = IntT
| t == ''Bool = BoolT
typeToMyType _ = OtherT

出于某种原因,GHC 不喜欢 ''Int模式中的语法,所以我不得不将它移到模式保护中。

关于haskell - 如何在采用 Type 的函数中为 Int 创建模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com