Difference between revisions of "Cum transform un numar intreg intr-un numar real ?"

From HaskellWiki
Jump to navigation Jump to search
Line 12: Line 12:
   
 
''round :: Float -> Int'' -- rotunjeste la intregul cel mai apropiat
 
''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)
   
 
----
 
----
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.
 
Nu pot imparti direct un real la un intreg, limbajul fiind puternic tipizat.

Revision as of 19:21, 5 November 2007

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


<= Inapoi la pagina principala Ro/Haskell