Cum scriem o functie dependenta de tipul argumentului ?

From HaskellWiki
Revision as of 19:36, 20 November 2007 by Ha$kell (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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:

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.


<= Inapoi la pagina principala Ro/Haskell