Cum scriem o functie dependenta de tipul argumentului ?

From HaskellWiki
Jump to navigation Jump to search
Haskell - 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.