Difference between revisions of "Cum scriem o functie dependenta de tipul argumentului ?"
m |
|||
Line 1: | Line 1: | ||
+ | [[Category:Ro]] |
||
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 ? |
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 .... |
Bineinteles ca va fi ceva polimorfic .... |
||
Line 7: | Line 8: | ||
Raspuns practic: Declarati o clasa si instante ale ei pentru fiecare tip pentru care doriti alt raspuns al functiei mtype: |
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 |
+ | -- Exemplu de functie care deosebeste tipuri. Luati din exemplu doar ideea. Exemplul insusi nu e chiar cel mai inspirat. |
+ | <haskell> |
||
− | class MyClass a where |
+ | class MyClass a where |
− | mtype :: a -> String |
+ | mtype :: a -> String |
− | instance MyClass Int where |
+ | instance MyClass Int where |
− | mtype _ = "Int" |
+ | mtype _ = "Int" |
− | instance MyClass Char where |
+ | instance MyClass Char where |
− | mtype _ = "Char" |
+ | mtype _ = "Char" |
− | instance MyClass Float where |
+ | instance MyClass Float where |
− | mtype _ = "Float" |
+ | mtype _ = "Float" |
− | instance MyClass Double where |
+ | instance MyClass Double where |
− | mtype _ = "Double" |
+ | mtype _ = "Double" |
+ | </haskell> |
||
Nota: nu uitati sa indentati declaratiile functiei mtype atat in declarartia de clasa cat si in cele de instante. |
Nota: nu uitati sa indentati declaratiile functiei mtype atat in declarartia de clasa cat si in cele de instante. |
||
Line 50: | Line 53: | ||
Aceasta pagina este neterminata. |
Aceasta pagina este neterminata. |
||
---- |
---- |
||
+ | Pagina indexata la indexul [[Category:Ro]] [http://www.haskell.org/haskellwiki/Category:Ro Categories:Ro] |
||
− | |||
+ | ---- |
||
− | [http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ] |
+ | [http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell. ]<br> <br> |
+ | [http://www.haskell.org/haskellwiki/Intrebarile_incepatorului <'''-''' Inapoi la Intrebarile incepatorului Ro/Haskell. ] |
Revision as of 22:28, 24 January 2008
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.