Пожалуйста, прочитайте мою проблему ниже, после выделенного жирным шрифтом, прежде чем тратить время на тщательное изучение этого кода. Я не хочу тратить ваше время, если вы не сможете ответить на этот вопрос.
Хорошо. Я создал свой собственный тип данных в Haskell. Это
data Dialogue= Choice String [(String, Dialogue)]
| Action String Event
-- deriving (Show)
Обратите внимание на закомментированное "выведение (показать)", которое важно для моей проблемы ниже.
У меня есть функция с именем dialog, определенная как
dialogue:: Game -> Dialogue -> IO Game
dialogue (Game n p ps) (Action s e) = do
putStrLn s
return (e (Game n p ps))
dialogue (Game n p ps) (Choice s xs) = do
putStrLn s
let ys = [ fst a | a <- xs ]
let i = [1..length ys]
putStrLn (enumerate 1 ys)
str <- getLine
if str `elem` exitWords
then do
return (Game n p ps)
else do
let c = read str::Int
if c `elem` i
then do
let ds = [ snd b | b <- xs ]
let d = ds !! c
putStrLn $ show d
return (Game n p ps)
else do
error "error"
Мой тип данных game определяется как
data Game = Game Node Party [Party] | Won
deriving (Eq,Show)
И Event — это тип, определенный мною как
type Event = Game -> Game
Вот где возникает моя проблема. Когда я загружаю этот файл в cmd, и у меня есть не включенный вывод в моем (Показать)<91503941 тип данных Диалог, я получаю следующую ошибку:
* No instance for (Show Dialogue) arising from a use of `show'
* In the second argument of `($)', namely `(show d)'
In a stmt of a 'do' block: putStrLn $ (show d)
In the expression:
do let ds = ...
let d = ds !! c
putStrLn $ (show d)
return (Game n p ps)
|
120 | putStrLn $ (show d)
Мне кажется, что мне нужно включить производное (Показать), чтобы иметь возможность печатать этот тип данных на консоль. Однако, когда я включаю производное (показать), я получаю эту ошибку:
* No instance for (Show Event)
arising from the second field of `Action' (type `Event')
(maybe you haven't applied a function to enough arguments?)
Possible fix:
use a standalone 'deriving instance' declaration,
so you can specify the instance context yourself
* When deriving the instance for (Show Dialogue)
|
85 | deriving Show
Я потратил довольно много времени, пытаясь выяснить, почему это может происходить. Но я не могу найти нигде в Интернете, где бы документировалась эта конкретная проблема.
Любая помощь будет идеальной, или даже просто ссылка на соответствующее объяснение.
**Редактировать: ** My Event является синонимом типа, поэтому я не могу добавить производное Show к этому
Большое спасибо
Event
должен иметь экземплярShow
, чтобы вещи, содержащие его, могли автоматически получитьShow
. Вероятно, это означает добавлениеderiving Show
к вашему определениюEvent
.Его тип
Event
является псевдонимом и не может содержать производное предложение. Это также функция, поэтому автоматическое получение не будет работать.Как вы ожидаете напечатать
Event
? Функции не могут быть напечатаны вообще. Возможно, вы могли бы определить свой собственныйinstance Show Dialogue
, не полагаясь наShow Event
, например. показывая это как некую общую строку "<event>".