Cum transform un numar intreg intr-un numar real ?

From HaskellWiki
Revision as of 19:18, 5 November 2007 by Ha$kell (talk | contribs)
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.

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


Urmariti exemplul urmator, 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: (///)


<= Inapoi la pagina principala Ro/Haskell