假设我有以下 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 的一些代码(每种方式我有多个不同的运行函数)。run 函数将尝试运行尽可能多的代码,然后报告它不能运行的代码以及它可以运行的代码的结果是什么。