Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Haskell转换为模板Haskell:cand';不匹配预期的类型ExpQ_Haskell_Template Haskell - Fatal编程技术网

将Haskell转换为模板Haskell:cand';不匹配预期的类型ExpQ

将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 =

我有以下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  = 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)|]