将Haskell转换为模板Haskell:cand';不匹配预期的类型ExpQ
我有以下Haskell代码(只是所有代码的一个片段,但仍然有效): 我正在尝试将其转换为模板Haskell。具体来说,我想摆脱字节码,只使用ExpQ(对我来说是新的)模板Haskell类型。所以现在我有:将Haskell转换为模板Haskell:cand';不匹配预期的类型ExpQ,haskell,template-haskell,Haskell,Template Haskell,我有以下Haskell代码(只是所有代码的一个片段,但仍然有效): 我正在尝试将其转换为模板Haskell。具体来说,我想摆脱字节码,只使用ExpQ(对我来说是新的)模板Haskell类型。所以现在我有: newtype C a = C ExpQ unC (C x) = x 我正在尝试更新实例,因此我的新代码是: newtype C t = C ExpQ unC (C t) = t instance Symantics C where int x =
newtype C a = C ExpQ
unC (C x) = x
我正在尝试更新实例,因此我的新代码是:
newtype C t = C ExpQ
unC (C t) = t
instance Symantics C where
int x = C(\vc -> (ExpQ x, vc))
bool b = C(\vc -> (ExpQ b, vc))
add e1 e2 = C(\vc -> let (e1b,vc1) = unC e1 vc
(e2b,vc2) = unC e2 vc1
in (Add e1b e2b,vc2))
但我得到了很多无法将预期类型“qexp”与实际类型“t1->(t0,t1)”匹配的错误。如何才能最好地编写这个新实例?在原始的
C
类型中,有一个整数“state”贯穿计算,这意味着C
newtype实际上包装了一个函数类型:
Int -> (ByteCode t, Int)
表达方式:
C (\vc -> ...) -- C constructor takes a function
及
在原始代码中反映了这一点
在新的C
类型中,您已经删除了状态,C
newtype只是一个ExpQ
,但是您没有更新任何代码来反映此更改,因此在ExpQ
(由新的C
包装的类型)和表单的函数Int->(字节码t,Int)
(由旧的C
包装的类型)
您可能会通过以下方式更接近您的预期目标:
instance Symantics C where
int x = C $ litE (IntegerL (fromIntegral x))
bool False = C [|False|]
bool True = C [|True|]
add e1 e2 = C [|$(unC e1) + $(unC e2)|]
ExpQ
类型只是Q Exp
的同义词。这里没有您试图使用的名为ExpQ
的构造函数。不清楚您试图实现什么,关于如何使用模板Haskell的完整教程不适合堆栈溢出。基于拼写错误的“Symantics”(以及您之前的几个问题)看起来您正试图跟随Oleg Kiselyov关于阶段性无标记最终口译员的一些文章?您能分享一下您基于什么以及您希望如何使用结果吗?
unC e1 vc -- unC e1 gets the function, and it's applied to vc
instance Symantics C where
int x = C $ litE (IntegerL (fromIntegral x))
bool False = C [|False|]
bool True = C [|True|]
add e1 e2 = C [|$(unC e1) + $(unC e2)|]