2015-05-04 3 views
3

В этом коде я могу построить список 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 не помогло

+0

Что вы ожидаете, что '' test ''будет« преобразован »точно? – Shoe

+0

to Lit "test" автоматический как с номерами –

ответ

11

Для "test" быть автоматически "конвертируется" в Algo, вам нужно будет определить экземпляр IsString, а затем использовать расширение GHC OverloadedStrings:

instance IsString Algo where 
    fromString = Lit 

Live demo

Для правильного функционирования:

print ["test", 1, 2, 3, Und, Nom 5, Lit "x"] 
-- [Lit "test",Nom 1.0,Nom 2.0,Nom 3.0,Und,Nom 5.0,Lit "x"] 
Смежные вопросы