Say У меня есть следующий 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', потому что вы используете шаблон для GADT. Кроме того, если вы возвращаете '(a, b)', у вас есть экранирование экзистенциального типа, поэтому это не сработает. – kosmikus
@kosmikus Добавьте это как ответ, пожалуйста. – dave4420
@ dave4420 Я надеялся, что это вызовет больше деталей, чтобы я мог тогда дать реальный ответ. Но нормально ... – kosmikus