Funkcioná lis prográmozá s Aszódi Józs

Funkcion?lis progr?moz?s

Asz?di J?zsef

Start

Ez a jegyzet a tud?som ?s a szerint k?sz?lt, elfordulhatnak benne hib?k, de igyekszem meg?rtetni.

Elsnek ?rdemes elolvasni, kis le?r?s a Haskell programnyelvrl:

Tov?bbiakban haszn?lom m?g ezeket: Haskell honlapja, ahonnan a GHCi is let?lthet: Haskell le?r?sok (data, types stb..): Haskell le?r?sok (functions, operators stb..):

Ez pedig m?g a zh-n is haszn?lhat?:

A meg?rt?shez fontos haszn?lni a honlapokat is, mert an?lk?l hi?nyoss?gok lehetnek (p?ld?ul a z?r?jelez?srl kezdetben m?g nem ?rok).

Az elej?tl fogva ?rdemes minden feladatot kipr?b?lni, kielemezni ?s ?rtelmezni, hiszen k?sbbiekben ezekre ?p?l a t?bbi. A feladatok megold?sai is szerepelnek itt (persze nem minden), de csak ?tmutat?nak, nem megold?snak..



1

Funkcion?lis progr?moz?s

Sz?mok



Asz?di J?zsef

Oszt?s

K?tf?le oszt?s van. Az egyik Fractional a-val (/) t?r vissza, a m?sik pedig Integral a-val (div).

(/)

Fractional a jelent?se: a kicser?lhet a Rational, Double, ... t?pusokra.

P?lda

1 / 3

0.3333333333333333 :: Double

(div)

Integral a jelent?se: a kicser?lhet az Int, Integer, ... t?pusokra.

P?lda

53 `div` 5

ak?r ?gy is fel?rhat?: ,,div 53 5"

10 :: Integer

vagyis 53-ban az 5 10-szer van meg.

Marad?k

53 `mod` 5 3 :: Integer

ak?r ?gy is fel?rhat?: ,,mod 53 5" vagyis 53 osztva 5-tel 3 marad?kot ad.

Feladatok

K?r?lbel?l h?ny m?sodperc van egy ?vben? 365 * 24 * 60 * 60

31536000 :: Integer

1.01 sug?r? g?mb t?rfog?t?? 4 * 1.01^3 * pi / 3

4.315714736781623 :: Double

23 osztja-e a 532253373-at? mod 532253373 23 == 0

True :: Bool

2

Funkcion?lis progr?moz?s

Asz?di J?zsef

Konverzi?k



Le?r?s

?ltal?nos esetben k?t k?l?nb?z t?pussal nem lehet dolgozni. Egy Double-t m?g ?sszehasonl?tani sem lehet egy Float-tal. Erre vannak az ?n. konverzi?k, amelyekkel az effajta t?pusk?l?nbs?gek kik?sz?b?lhetek. Ezek csak azon t?pusokra haszn?lhat?ak, amelyek az ?rtelmez?si tartom?nyaikban szerepelnek, de az ?rt?kk?szletben l?v t?pus?k?nt haszn?lhat?ak.

Unik?d

R?szletek a List?n?l (String-n?l)

fromIntegral

?rtelmez?si tartom?ny: Int vagy Integer ?rt?kk?szlet: Int, Integer, Rational, Float, Double

realToFrac

?rtelmez?si tartom?ny: Int, Integer, Rational, Float vagy Double ?rt?kk?szlet: Rational, Float, Double

H?szn?l?t

(5 :: Int) == (5 :: Integer) => Nem lehet ?sszehasonl?tani, mert a t?pusuk k?l?nb?zik (egyik Int, a m?sik Integer) De fromIntegral (5 :: Int) == fromIntegral (5 :: Integer) == True :: Bool ?gy m?r lehet mveleteket v?gezni k?t k?l?nb?z sz?mmal. Ez szint?n igaz a realToFrac-ra is, amely t?bb t?pusra haszn?lhat?.

Kerek?t?sek

truncate truncate :: (Integral b, RealFrac a) => a -> b Nulla fel? es eg?sz sz?mra kerek?t. truncate 1.001 == truncate 1.999 == 1 :: Integer truncate (-1.999) == truncate (-1.001) == -1 :: Integer

round round :: (Integral b, RealFrac a) => a -> b Legk?zelebbi eg?sz sz?mhoz kerek?t. round 0.001 == round 0.500 == 0 :: Integer round 0.501 == round 1.499 == 1 :: Integer round (-0.501) == round (-1.499) == -1 :: Integer

Megj.: 0.5 ?> 0; 1.5 ?> 2; 2.5 ?> 2; 3.5 ?> 4; 4.5 ?> 4; 5.5 ?> 6; 6.5 ?> 6; 7.5 ?> 8; 8.5 ?> 8; 9.5 ?> 10

ceiling ceiling :: (Integral b, RealFrac a) => a -> b Felfel? kerek?t. floor 1.001 == floor 1.999 == 2 :: Integer floor (-1.001) == floor (-1.999) == (-1) :: Integer

floor floor :: (Integral b, RealFrac a) => a -> b Lefel? kerek?t. floor 1 == floor 1.999 == 1 :: Integer floor (-1.001) == floor (-1.999) == (-2) :: Integer

3

Funkcion?lis progr?moz?s

Asz?di J?zsef

M?gy?r?z?t Mint l?that?, a round x.5 eset?n mindig a p?ros sz?mhoz kerek?t. Ennek az ?sszegz?sn?l van szerepe: Vegy?k a [0.5, 1.5 .. 100.5] list?t, amelynek az ?sszege: sum [0.5, 1.5 .. 100.5] == 5100.5 :: Double Ha felfel? kerek?ten?nk (ceiling), akkor ez 5151 lenne, lefel? kerek?t?s (floor) eset?n pedig 5050. A round-n?l ez az ?sszeg 5100.

Feladatok

10^9 gy?k?hez legk?zelebb es eg?sz sz?m? round (sqrt 10 ^ 9)

Mi az unik?d k?dj? az `x' karakternek? fromEnum `x'

Melyik az 50 unik?d k?d? karakter? (toEnum 50 :: Char)

31623 :: Integer 120 :: Int `2' :: Char

4

Funkcion?lis progr?moz?s

Asz?di J?zsef

Bool



Kisebb (), kisebb egyenl (=), egyenl (==), nem egyenl (/=) ?s a neg?l?s (not). Szintaktik?ban az a == b helyes, de az a == b == c m?r nem, csak z?r?jelezve, (a==b)==c, ahol c True vagy False.

Mveletek

(&&) True && True == True False && True== False

(||) True || True == True False || True== True

True && False == False False && False == False

True || False == True False || False == False

Feladatok

Kifejez?s, amely pontosan akkor True ha a 23 nem osztja a 532253373-at!

div 532253373 23 /= 0 vagy

not (div 532253373 23 == 0)

?rjuk ki a rejtett z?r?jeleket! 6 < 4 || 4 >= 5 && 12 /= 4 * 4

=>

(((6 < 4) || (4 >= 5)) && (12 /= (4 * 4)))

T?vol?tsunk el min?l t?bb z?r?jelp?rt! ((1 < 2) && (50 > (100 - 2) `mod` 50)) =>

1 < 2 && 50 > (100 - 2) `mod` 50

Z?r?jelezz?k a k?vetkez kifejez?st!

2 < div 18 4 || mod 15 5 > (-3)

=>

((2 < (div 18 4)) || ((mod 15 5) > (-3)))

5

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download