Personal tools

Cum scriem o functie dependenta de tipul argumentului ?

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
 
m (pict)
 
(One intermediate revision by one user not shown)
Line 1: Line 1:
  +
[[Image:Haskelllogo-small-flag-RO-8.jpg|center|Haskell - Cum scriem o functie dependenta de tipul argumentului ?]]
  +
[[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 9:
 
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.
   
class MyClass a where <br>
+
<haskell>
mtype :: a -> String
+
class MyClass a where
  +
mtype :: a -> String
   
instance MyClass Int where <br>
+
instance MyClass Int where
mtype _ = "Int"
+
mtype _ = "Int"
   
instance MyClass Char where <br>
+
instance MyClass Char where
mtype _ = "Char"
+
mtype _ = "Char"
   
instance MyClass Float where <br>
+
instance MyClass Float where
mtype _ = "Float"
+
mtype _ = "Float"
   
instance MyClass Double where <br>
+
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 52:
 
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. ]

Latest revision as of 13:27, 4 October 2008

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.