В этом коде я могу построить список Algo
с использованием некоторых прямых конструкторов, таких как Lit
и Nom
, но и из целых чисел. Это происходит потому, что Algo
получает Num
.Принуждение типа Haskell для строк
Возможно ли сделать что-то подобное для строк?
type Nr = Double
data Algo
= Nom Nr
| Lit String
| Und
deriving (Show)
instance Num Algo where
(+) (Nom a) (Nom b)=Nom(a+b)
(+) _ _=Und
(*) (Nom a) (Nom b)=Nom(a*b)
(*) _ _=Und
abs (Nom a)=Nom(abs a)
abs _=Und
signum (Nom a)=Nom(signum a)
signum _=Und
fromInteger a=Nom(fromInteger a)
main=do
print ([1,2,3,Und,Nom 5,Lit "x"]::[Algo])
работает нормально с результатом:
[Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"]
требуемый код:
print (["test",1,2,3,Und,Nom 5,Lit "x"]::[Algo])
выдаст сообщение об ошибке, конечно ... , где это происходит преобразование? при анализе/компиляции?
readPrec не помогло
Что вы ожидаете, что '' test ''будет« преобразован »точно? – Shoe
to Lit "test" автоматический как с номерами –