2015-03-03 2 views
3

АТД является свободной монады:Как я могу сделать это шоу Haskell ADT Show?

data Free f r = Free (f (Free f r)) | Pure r 

Я хотел бы, чтобы он получить Show так, что я могу распечатать его при работе с ним. Например, если у меня есть следующие:

data T next = A next | B next deriving (Show) 
aa = Free $ A $ Free $ B $ Pure() 

Как это прямо сейчас, я получаю следующее сообщение об ошибке, если добавить deriving (Show) к Free ADT:

No instance for (Show (f (Free f r))) 
     arising from the first field of ‘Free’ (type ‘f (Free f r)’) 
    Possible fix: 
     use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
    When deriving the instance for (Show (Free f r)) 

Я хотел бы, чтобы show aa к приведет к печати строки. Это возможно?

+0

Вам нужно использовать 'instance Free Show of ...' – beoliver

+1

Проверьте [автономное получение] (https://wiki.haskell.org/GHC/Stand-alone_deriving_declarations) –

ответ

6

Как указано в сообщении об ошибке, вам необходимо использовать расширение с именем StandaloneDeriving, которое позволяет явно указать ограничения на производный экземпляр. Вам также необходимо включить UndecidableInstances для поддержки необходимого вам ограничения.

{-# LANGUAGE StandaloneDeriving, UndecidableInstances #-} 

deriving instance (Show r, Show (f (Free f r))) => Show (Free f r) 
+1

Спасибо. Но у меня все еще были ошибки. После сообщений об ошибках мне пришлось включить три расширения: «StandaloneDeriving», «FlexibleInstances», «UndecidableInstances». Этого можно ожидать? – Ana

+0

@ Ана: Да, это выглядит правильно. Я просто забыл вставить их в свой ответ; Сейчас я их отредактирую. –

+2

@Ana: На самом деле вам не нужны 'FlexibleInstances', так как у вас есть' UndecidableInstances'. –

2

Возможный альтернативный подход, который позволяет избежать UndecidableInstances, но менее широко применяется, чтобы использовать Show1 класс от prelude-extras. Это дает вам хорошее ограничение (Show1 f, Show r), но дает вам возможность написать собственный (простой) экземпляр.

Смежные вопросы