Cum transform un numar intreg intr-un numar real ?
From HaskellWiki
m |
|||
| (5 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
| + | [[Category:Ro]] | ||
| + | |||
| + | Banner pro educational: | ||
| + | <center> | ||
| + | http://www.haskell.org/sitewiki/images/2/2c/BannerProLinuxAndHaskell.gif | ||
| + | |||
| + | Fii student ! Haskell si Linux se invata la facultate. Si asigura productivitatea muncii de programare. | ||
| + | </center> | ||
| + | ---- | ||
| + | |||
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: | 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: | ||
| Line 13: | Line 23: | ||
''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) | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Nu pot imparti direct un real la un intreg, limbajul fiind puternic tipizat. | ||
| + | |||
| + | <haskell> | ||
| + | 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 | ||
| + | </haskell> | ||
| + | |||
| + | |||
| + | '''Dar pot converti intregul la real si face impartirea pe urma.''' | ||
| + | |||
| + | <haskell> | ||
| + | Prelude> (10.2::Float)/fromInt(2::Int) | ||
| + | 5.1 | ||
| + | </haskell> | ||
| + | |||
| + | |||
| + | '''Puteti folosi in loc de fromInt si pe fromIntegral, cel putin in anumite circumstante.''' | ||
| + | |||
| + | <haskell> | ||
| + | Prelude> (10.2::Float)/fromIntegral(2::Int) | ||
| + | 5.1 | ||
| + | Prelude> | ||
| + | </haskell> | ||
| + | |||
| + | 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: (///) | ||
| + | |||
| + | ---- | ||
| + | Compilatorul dumneavoastra nu va gaseste functia fromInt ? | ||
| + | Incercati fromInteger in loc! Probabil folositi o versiune de GHCi. | ||
| + | |||
| + | <haskell> | ||
| + | <interactive>:1:0: Not in scope: `fromInt' | ||
| + | *ClassPlus> :t fromInteger | ||
| + | fromInteger :: (Num a) => Integer -> a | ||
| + | *ClassPlus> | ||
| + | </haskell> | ||
| + | |||
| + | Daca ati avut asa o problema va scoate din incurcatura Hoogle, motorul de cautare a functiilor. | ||
| + | ---- | ||
| + | Pagina indexata la indexul [[Category:Ro]] [http://www.haskell.org/haskellwiki/Category:Ro Categories:Ro] | ||
---- | ---- | ||
| - | [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. ]<br> <br> |
| + | [http://www.haskell.org/haskellwiki/Intrebarile_incepatorului <'''-''' Inapoi la Intrebarile incepatorului Ro/Haskell. ] | ||
Current revision
Banner pro educational:
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.
