Cum scriem o functie dependenta de tipul argumentului ?

From HaskellWiki
Revision as of 22:28, 24 January 2008 by Ha$kell (talk | contribs)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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.