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

[Pages:29]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

Funkcion?lis progr?moz?s

List?k



Asz?di J?zsef

Fel?p?t?s?k

A list?k elemei csak ugyanolyan t?pus?ak lehetnek, mint p?ld?ul [1,2,3], ahol a t?pus az Integer, vagy [True, True], ahol Bool, de az [1,2,True], m?r helytelen. ?res lista: []

A sorrend ?s a hossz is l?nyeges:

[1,2,3] /= [3,1,2]

[1,1] /= [1]

Ugyan?gy az egy elem list?k sem ?sszehasonl?that?ak az elemmel:

[13] ?s 13 nem ugyanaz, de nem is ?sszehasonl?that?ak!!

([13] :: [Integer], 13 :: Integer, vagyis m?s a t?pusuk)

PontPont kidejez?sek

PontPont kifejez?seket egyszers?g miatt szoktunk haszn?lni. P?ld?ul az [1..5] megegyezik az [1,2,3,4,5] list?val. K?t elemet is megadhatunk kezdetnek, ekkor ez a sorozat n?veked?s?t vagy cs?kken?s?t adja meg: [1,3..10] azt jelenti, hogy 2-vel n?vekszik a sorozat, ?gy [1,3,5,7,9] lesz. [1,(-2).. (-10)] pedig ezzel lesz egyenl [1,-2,-5,-8]

V?gtelen list?kra is ezt alkalmazzuk: [1..] 1-tl meg a v?gtelenbe egyes?vel, [1,3..] pedig kettes?vel..

Sz?veg (String)

A sz?veg karakterekbl ?p?l fel, ez?rt a String t?pus nem m?s, mint [Char]. ,,abc" == [`a','b','c'] [`a'..'z'] a kisbetk list?ja, vagyis ,,abcdefghijklmnopqrstuvwxyz" :: [Char] [`A'..'Z'] a nagybetk list?ja, vagyis "ABCDEFGHIJKLMNOPQRSTUVWXYZ" :: [Char] [`0'..'9'] a sz?mok list?ja, vagyis "0123456789" :: [Char]

Karakter unik?d k?dd? ?l?k?t?s

fromEnum `4'

== ord `4' == 52 :: Int

digitToInt `4' == 4 :: Int (ez csak 0-9 ?s A-F eset?n)

Egy sz?m szerinti karakter toEnum 52 :: Char == chr 52 == `4' :: Char intToDigit 4 == `4' :: Char (ez csak 0-15 eset?n)

A toEnum ?s a fromEnum Prelude-ben van benne, az ord, chr, intToDigit ?s a digitToInt pedig a Data.Char-ban.

Mvelet list?kon

T?bb fontosabb mvelet (filter, map, concat stb...) k?sbb fognak szerepelni.

length

Visszaadja a lista hossz?t v?ges lista eset?n.

length [4,7,8] == 3 :: Int

length ,,alma" == 4 :: Int

length [1..1000] == 1000 :: Int

(!!)

A megadott helyen l?v elemet adja vissza. A list?k 0-t?l indexeldnek.

[`a','b','c'] !! 1 == `b' :: Char ,,abc" !! 0 == `a' :: Char

,,a" !! 1 == Error

[1..10] !! 9 == 10 :: Integer

(++) K?t list?t konkaten?l.

,,he" ++ ,,llo" == ,,hello"

[1..5] ++ [6..10] == [1..10]

[1] ++ [] == [1]

[] ++ [1] == [1]

6

Funkcion?lis progr?moz?s

Asz?di J?zsef

sum ?s product

sum a lista ?sszeg?t adja vissza, a product pedig a szorzatot. Ez csak Num a t?pus?akra haszn?lhat?.

sum [1..10] == 55 :: Integer

product [1..10] == 3 628 800 :: Integer

sum [1.0, 1.1, 1.2] == 3.3 :: Double

product [1.0,1.1,1.2] == 1.32 :: Double

Feladatok

Soroljuk fel 10-tl vissz?fel? -10-ig a sz?mok?t!

[10,9.. -10]

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10] :: [Integer]

Adjuk meg a 113. elem?t annak a sz?mt?ni sorozatnak, amelynek az els k?t eleme 11 ?s 32!

[11,32..] !! 112

2363 :: Integer

H?nyf?lek?ppen lehet sorba rendezni 10 k?l?nb?z elemet?

product [1..10]

3628800 :: Integer

H?nyf?lek?ppen v?l?szth?tunk ki 70 k?l?nb?z elembl 30 elemet?

div (product [41..70]) (product [1..30])

55347740058143507128 :: Integer

7

Funkcion?lis progr?moz?s

Halmazkifejez?sek



Asz?di J?zsef

Fel?p?t?s?k

A p?lda: { n2 | n N, n p?ros }

Megold?s: [ n^2 | n ................
................

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

Google Online Preview   Download