Haskell ГАДТ и Деривинг Шоу - PullRequest
1 голос
/ 26 января 2020

Как мне заставить show работать на конструкторе данных Bind? Первые два (Return и Put), кажется, работают нормально. Поскольку Bind принимает функцию в качестве аргумента, я решил, что это требует особой "обработки"?

data Program a where
  Put    :: Char -> Program ()
  Get    :: Program (Maybe Char)
  Return :: a -> Program a
  Bind   :: Program a -> (a -> Program b) -> Program b

instance Show a => Show (Program a) where
    show (Return a) = show a
    show (Put a) = show a
    show (Bind pr f) = show pr   -- incorrect


• Could not deduce (Show a1) arising from a use of ‘show’
  from the context: Show a
    bound by the instance declaration at EDSL_Deep1.hs:18:10-35
  Possible fix:
    add (Show a1) to the context of the data constructor ‘Bind’
• In the expression: show pr
  In an equation for ‘show’: show (Bind pr f) = show pr
  In the instance declaration for ‘Show (Program a)’

1 Ответ

2 голосов
/ 27 января 2020

Я думаю, вы можете смешивать переменные вашего типа. 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, и именно поэтому вы получаете ошибку. Как сказано в комментариях, я не думаю, что здесь есть надежда.

...