说我有以下GADT:不能破坏传递的类型
data Stage a b where
Comb :: Stage a b -> Stage b c -> Stage a c
FMap :: (a -> b) -> Stage a b
我现在想要的是这样的一个功能:
run (a `Comb` b) = (a,b)
run (FMap f) = (FMap f,FMap id)
我将如何构建这样的功能?
我尝试了不同的方式来绑定类型,但没有成功。 有没有扩展我缺少,使更多的类型绑定?
这是错误消息:
Couldn't match type `t' with `(Stage t1 b, Stage b t2)'
`t' is a rigid type variable bound by
the inferred type of run :: Stage t1 t2 -> t at <interactive>:11:5
In the expression: (a, b)
In an equation for `run': run (a Comb b) = (a, b)
什么我要完成的描述: 我想设计一个DSL和功能的运行,可以尝试在一对夫妇运行DSL的一些代码不同的方式(每种方式我有多个不同的运行功能)。 运行函数将尝试尽可能多地运行代码,然后报告它无法运行的代码以及它可以运行的代码的结果。
由于您在GADT上进行了模式匹配,因此您需要'run'的类型签名。另外,如果你返回'(a,b)',你有一个存在类型转义,所以这是行不通的。 – kosmikus 2013-03-06 19:12:08
@kosmikus将此添加为答案。 – dave4420 2013-03-06 19:29:36
@ dave4420我希望这会提示更多细节,以便我能够给出真正的答案。但好的... – kosmikus 2013-03-06 19:39:43