Я думаю, вы можете смешивать переменные вашего типа. a
в Program a
не имеет отношения к a
s в типах конструкторов. Это просто там, чтобы указать вид программы. На самом деле с KindSignatures
вы также можете сказать data Program :: Type -> Type
. Пока мы это делаем, давайте также переименуем переменные в Bind, потому что мы можем:
data Program :: Type -> Type where
Put :: Char -> Program ()
Get :: Program (Maybe Char)
Return :: a -> Program a
Bind :: Program x -> (x -> Program y) -> Program y
Это то же определение. Надеюсь, это дает понять, что вы пытаетесь показать Program x
, имея только Show y
, и именно поэтому вы получаете ошибку. Как сказано в комментариях, я не думаю, что здесь есть надежда.