Personal tools

Cum transform un numar intreg intr-un numar real ?

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
m
Line 14: Line 14:
   
 
----
 
----
  +
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)
  +
<br>5.1
  +
  +
'''Puteti folosi in loc de fromInt si pe fromIntegral, cel putin in anumite circumstante.'''
  +
  +
Prelude> (10.2::Float)/fromIntegral(2::Int)
  +
<br>5.1
  +
<br>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:<br>
  +
''infixl 7 ''
  +
  +
...inainte de a scrie functia care-i exprima comportarea. Numele sau va fi, de exemplu: (///)
  +
  +
 
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ]
 
[http://www.haskell.org/haskellwiki/Ro/Haskell <= Inapoi la pagina principala Ro/Haskell ]

Revision as of 19:18, 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


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