Cum transform un numar intreg intr-un numar real ?

From HaskellWiki
Revision as of 17:49, 1 November 2009 by Ha$kell (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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.


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.