я реализовал эти (упрощенный) типы данных в программе Haskell:Read экземпляр комбинированного типа данных с Haskell
data Type = ValA
| Valb
| ValC
data Prefix = PrefA
| PrefB
| PrefC
| NoPref
data Combin = Combin Prefix Type
instance Show Type where
show ValA = "typeA"
show Valb = "O"
show ValC = "mp"
instance Read Type where
readsPrec _ "typeA" = [(ValA,"")]
readsPrec _ "O" = [(Valb,"")]
readsPrec _ "mp" = [(ValC,"")]
instance Show Prefix where
show PrefA = "a"
show PrefB = "bm"
show PrefC = "c"
show NoPref = ""
instance Read Prefix where
readsPrec _ "a" = [(PrefA,"")]
readsPrec _ "bm" = [(PrefB,"")]
readsPrec _ "c" = [(PrefC,"")]
readsPrec _ "" = [(NoPref,"")]
instance Show Combin where
show (Combin pre typ) = show pre++show typ
с экземплярами, я могу show
и read
типов Prefix
и Type
. Тип данных Combin
представляет собой конкатенацию Prefix
и Type
. Теперь я хотел бы реализовать экземпляр чтения для типа данных Combin
, и я понятия не имею, как это сделать.
Я думал о выводе типа Combin, но это приводит к тому, что выходная строка Combin PrefA ValC будет «Combin mp». И это не то, что я хочу. Я хочу, чтобы «усилитель» объединился. То же самое, что и для чтения
Я думал о создании шаблона, соответствующего строке ввода, но строки Prefix
имеют разную длину и могут быть недействительными (NoPref
).
Вы когда-нибудь реализовывали такую функциональную функцию с чтением? Вы знаете, как это сделать?
Почему бы просто не использовать 'Выводя (Читать, Показать) '? Таким образом, вам не нужно писать ни один из этих экземпляров. – bheklilr
Поскольку вывод 'Combin' вызывает вывод строки« Combin PrefA ValC »как« Combin a mp ».И это не то, что я хочу. Я хочу, чтобы «усилитель» объединился. То же самое для чтения. – JeanJouX