Personal tools

Cum transform un numar intreg intr-un numar real ?

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
 
(3 intermediate revisions by one user not shown)
Line 1: Line 1:
  +
[[Category:Ro]]
  +
  +
Banner pro educational:
  +
<center>
  +
http://www.haskell.org/sitewiki/images/2/2c/BannerProLinuxAndHaskell.gif
  +
  +
Fii student ! Haskell si Linux se invata la facultate. Si asigura productivitatea muncii de programare.
  +
</center>
  +
----
  +
 
Ca un exercitiu, puteti scrie si dumneavoastra o functie care sa transforme un intreg intr-un real sau invers dar aceste functii sunt deja definite:
 
Ca un exercitiu, puteti scrie si dumneavoastra o functie care sa transforme un intreg intr-un real sau invers dar aceste functii sunt deja definite:
   
Line 22: Line 32:
 
Nu pot imparti direct un real la un intreg, limbajul fiind puternic tipizat.
 
Nu pot imparti direct un real la un intreg, limbajul fiind puternic tipizat.
   
  +
<haskell>
 
Prelude> (10.2::Float)/(2::Integer)
 
Prelude> (10.2::Float)/(2::Integer)
 
ERROR - Type error in application
 
ERROR - Type error in application
Line 35: Line 46:
 
*** Type : Float
 
*** Type : Float
 
*** Does not match : Int
 
*** Does not match : Int
  +
</haskell>
  +
   
 
'''Dar pot converti intregul la real si face impartirea pe urma.'''
 
'''Dar pot converti intregul la real si face impartirea pe urma.'''
   
  +
<haskell>
 
Prelude> (10.2::Float)/fromInt(2::Int)
 
Prelude> (10.2::Float)/fromInt(2::Int)
<br>5.1
+
5.1
  +
</haskell>
  +
   
 
'''Puteti folosi in loc de fromInt si pe fromIntegral, cel putin in anumite circumstante.'''
 
'''Puteti folosi in loc de fromInt si pe fromIntegral, cel putin in anumite circumstante.'''
   
  +
<haskell>
 
Prelude> (10.2::Float)/fromIntegral(2::Int)
 
Prelude> (10.2::Float)/fromIntegral(2::Int)
<br>5.1
+
5.1
<br>Prelude>
+
Prelude>
  +
</haskell>
   
 
Observati ca sunt definite putin diferit, bazandu-se pe apartenenta argumentelor la alte clase de tipuri! Primul primeste doar argument de tip Int - intregi scurti. Al doilea primeste argument de orice tip din clasa Integral.
 
Observati ca sunt definite putin diferit, bazandu-se pe apartenenta argumentelor la alte clase de tipuri! Primul primeste doar argument de tip Int - intregi scurti. Al doilea primeste argument de orice tip din clasa Integral.
Line 65: Line 80:
 
...inainte de a scrie functia care-i exprima comportarea. Numele sau va fi, de exemplu: (///)
 
...inainte de a scrie functia care-i exprima comportarea. Numele sau va fi, de exemplu: (///)
   
  +
----
  +
Compilatorul dumneavoastra nu va gaseste functia fromInt ?
  +
Incercati fromInteger in loc! Probabil folositi o versiune de GHCi.
   
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ]
+
<haskell>
  +
<interactive>:1:0: Not in scope: `fromInt'
  +
*ClassPlus> :t fromInteger
  +
fromInteger :: (Num a) => Integer -> a
  +
*ClassPlus>
  +
</haskell>
  +
  +
Daca ati avut asa o problema va scoate din incurcatura Hoogle, motorul de cautare a functiilor.
  +
----
  +
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. ]<br> <br>
  +
[http://www.haskell.org/haskellwiki/Intrebarile_incepatorului <'''-''' Inapoi la Intrebarile incepatorului Ro/Haskell. ]

Latest revision as of 17:49, 1 November 2009


Banner pro educational:

BannerProLinuxAndHaskell.gif

Fii student ! Haskell si Linux se invata la facultate. Si asigura productivitatea muncii de programare.


Ca un exercitiu, puteti scrie si dumneavoastra o functie care sa transforme un intreg intr-un real sau invers dar aceste functii sunt deja definite:


Incercati sa folositi:

fromInt :: Int -> Float -- transforma un Int intr-un Float .

ceiling  :: Float -> Int -- rotunjeste la intregul imediat superior

floor :: Float -> Int -- rotunjeste la intregul imediat inferior

round :: Float -> Int -- rotunjeste la intregul cel mai apropiat

fromIntegral :: (Integral a, Num b) => a -> b -- transforma ceva de un tip de clasa Integral in ceea ce va trebuie.


Urmariti exemplele urmatoare, unde cu :: am fortat ca un numar sa apartina unui anumit tip. (Seamana cu cast-urile din C)


Nu pot imparti direct un real la un intreg, limbajul fiind puternic tipizat.

Prelude> (10.2::Float)/(2::Integer)
ERROR - Type error in application
*** Expression     : 10.2 / 2
*** Term           : 10.2
*** Type           : Float
*** Does not match : Integer
 
Prelude> (10.2::Float)/(2::Int)
ERROR - Type error in application
*** Expression     : 10.2 / 2
*** Term           : 10.2
*** Type           : Float
*** Does not match : Int


Dar pot converti intregul la real si face impartirea pe urma.

Prelude> (10.2::Float)/fromInt(2::Int)
5.1


Puteti folosi in loc de fromInt si pe fromIntegral, cel putin in anumite circumstante.

Prelude> (10.2::Float)/fromIntegral(2::Int)
5.1
Prelude>

Observati ca sunt definite putin diferit, bazandu-se pe apartenenta argumentelor la alte clase de tipuri! Primul primeste doar argument de tip Int - intregi scurti. Al doilea primeste argument de orice tip din clasa Integral.

Prelude> :t fromInt

fromInt :: Num a => Int -> a

Prelude> :t fromIntegral

fromIntegral :: (Integral a, Num b) => a -> b


Exercitiu: Definiti un operator, sa-i zicem /// pentru impartirea unui real la un intreg. Ce prioritete trebuie sa aiba? Cum va asocia ?

Indicatie: Prioritate 7 ca si impartirea si inmultirea. Operator infixat - adica plasat intre operanzi. Asociativitate la stanga deci se declara:
infixl 7

...inainte de a scrie functia care-i exprima comportarea. Numele sau va fi, de exemplu: (///)


Compilatorul dumneavoastra nu va gaseste functia fromInt ? Incercati fromInteger in loc! Probabil folositi o versiune de GHCi.

<interactive>:1:0: Not in scope: `fromInt'
*ClassPlus> :t fromInteger
fromInteger :: (Num a) => Integer -> a
*ClassPlus>

Daca ati avut asa o problema va scoate din incurcatura Hoogle, motorul de cautare a functiilor.


Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la Intrebarile incepatorului Ro/Haskell.