У меня есть неоднозначная ошибка переменной типа в определении «испытания» ниже, мне интересно, есть ли что-нибудь, что можно сделать, чтобы заставить эту ситуацию работать? Я действительно хочу иметь дело только с экземплярами, а не с явными типами данных (такими как MO1, MO2, включенные ниже).
module Tc102 where
class (Show a, Read a) => MyObj a where
alpha :: a->String
beta :: a->Int
data MO1 = MO1 { a1 :: String, b1 :: Int } deriving (Show,Read)
data MO2 = MO2 { a2 :: String, b2 :: Int } deriving (Show,Read)
instance MyObj MO1 where
alpha = a1
beta = b1
instance MyObj MO2 where
alpha = a2
beta = b2
a = MO1 "a" 3
b = MO2 "b" 4
test :: MyObj a => a->String
test = alpha
showMe :: (MyObj a)=> a -> String
showMe = show
readMe :: (MyObj a) => String -> a
readMe = read
trial :: MyObj a => a -> String
trial = test . readMe . showMe
заранее всем спасибо! Однако, боюсь, мне может понадобиться вспомогательная функция, которая преобразует старый ADT в «последние версии» ...
Simon
РЕДАКТИРОВАТЬ Для пояснения, представьте, что я сначала показываю в файл, а затем перезагружаю объект. Тогда функция, которая у меня есть, больше похожа на
trial :: String -> Int
trial s = beta x
where x = readMe s