次の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 を設計したいと考えています (それぞれの方法に複数の異なる run 関数があります)。run 関数は、与えられたコードをできるだけ多く実行しようとし、実行できなかったコードと、実行できたコードの結果を報告します。