Cum scriem o functie dependenta de tipul argumentului ?
Intrebarea, pe larg: Haskell este un limbaj puternic tipizat. Cum pot scrie o functie al carui rezultat sa depinda de TIPUL si nu de valoarea argumentului sau ?
Bineinteles ca va fi ceva polimorfic ....
Raspuns teoretic: Puteti folosi mai multe instante ale aceleiasi clase. La programarea orientata obiect (in C++) atunci cand se instantia o clasa trebuiau precizate valorile datelor (din obiect). In Haskell, fiind programare functionala, atunci cand un TIP este declarat ca instanta a unei clase trebuie precizate niste functii.
(Nota:clasa din Haskell e un tip de date abstract, dotat cu anumite declaratii de functii.)
Raspuns practic: Declarati o clasa si instante ale ei pentru fiecare tip pentru care doriti alt raspuns al functiei mtype:
-- Exemplu de functie care deosebeste tipuri. Luati din exemplu doar ideea. Exemplul insusi nu e chiar cel mai inspirat.
class MyClass a where
mtype :: a -> String
instance MyClass Int where
mtype _ = "Int"
instance MyClass Char where
mtype _ = "Char"
instance MyClass Float where
mtype _ = "Float"
instance MyClass Double where
mtype _ = "Double"
Nota: nu uitati sa indentati declaratiile functiei mtype atat in declarartia de clasa cat si in cele de instante.
Main> mtype (1::Int)
"Int"
Main> mtype (1::Float)
"Float"
Main> mtype ('1'::Char)
"Char"
Main> mtype (1::Double)
"Double"
Main> mtype (1::Float)
"Float"
Nota: Acest mecanism are si unele restrictii:
1. In declaratiile de instanta nu se folosesc (cel putin La Hugs 2002) sinonime de tipuri.
2. Uneori trebuie introdus noul tip (desi este sinonim cu altul existent) printr-o declaratie newtype. Abia apoi se face instantierea si noul tip va fi instanta a clasei dorite.
3. Unele versiuni de Haskell nu acceptau (sau nu acceptau cu switch-urile implicite) clase de tipuri cu mai multi parametri.
O alta solutie este sa importati Data.Typeable. .... Aceasta pagina este neterminata.
Pagina indexata la indexul Categories:Ro
<= Inapoi la pagina principala Ro/Haskell.
<- Inapoi la Intrebarile incepatorului Ro/Haskell.