Вам действительно нужно изобретать здесь новые классы типов? Prelude
механизм достаточно сложен, вы думаете. Это может быть связано только с включением String
, но есть и другие способы. Кажется, вы просто хотите общее отображение из стандартных числовых типов (Int
, Integer
, Float
, Double
) в Double
. Есть много способов сделать это, но что насчет d
здесь, вместо вашего value
?
d :: Real a => a -> Double
d = fromRational . toRational
test (Just a, Just b) = show (d a) ++ " " ++ show (d b)
test (_, _)= "Something's missing"
-- Main> :t test
-- test :: (Real a, Real a1) => (Maybe a, Maybe a1) -> [Char]
double :: Double
double = 1.0
float :: Float
float = 1.0
int :: Int
int = 1
integer :: Integer
integer = 2
omnibus = d double * d float * d int / d integer
jdouble = Just double
jinteger = Just integer
goodtest = (jdouble,jinteger)
badtest = (Nothing, jinteger)
main = print omnibus >> putStrLn (test goodtest) >> putStrLn (test badtest)
-- Main> main
-- 0.5
-- 1.0 2.0
-- Something's missing
Если вы хотите применить d
к String
, то вы хотите обрабатывать строки числами. Хорошо, один из способов сделать это - определить экземпляр Num
для String
с целью создания экземпляра Real
. Просто Google "экземпляр Num String", или посмотрите, например, это замечание dons
для примеров. Вот несерьезный пример:
instance Num String where
fromInteger = show
(+) = (++)
x * y = concatMap (const y) x
abs = undefined
signum = undefined
instance Real String where toRational = toRational . d . length
-- Main> fromInteger 500 * "moo "
-- "moo moo moo "
-- Main> d (fromInteger 500 * "moo")
-- 12.0
stringy = d "string"
jstringy = Just stringy
stringytest = (jstringy, jinteger)
main' = print omnibus >> print stringy >>
putStrLn (test goodtest) >> putStrLn (test badtest) >>
putStrLn (test stringytest)
-- Main> main'
-- 0.5
-- 5.0
-- 1.0 2.0
-- Something's missing
-- 5.0 2.0
Или, если вам нужен класс типа PlotValue
с value
, почему бы не создать его отдельно для четырех ведущих числовых типов и String
? На самом деле, тип Input
, который вам нужен, действительно похож на (Maybe Double, Maybe Double)
.
Обратите внимание, что там, где вы пишете
main = do
putStrLn (show ( test (Just "strl", Just 6.4)))
вам не нужно do
, так как вы видите только одно действие; и вам не нужно показывать, так как test
уже дает String
.