Cum transform un numar intreg intr-un numar real ?

From HaskellWiki
Revision as of 19:17, 18 October 2009 by Ha$kell (talk | contribs) (Haskell and Linux are teached in collegues and faculties ... banner pro Haskell added.)
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

Haskell si Linux se invata la facultate. Si asigura productivitatea.


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: (///)



Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la Intrebarile incepatorului Ro/Haskell.