Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЛП Лаб каз.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
520 Кб
Скачать
☆

«Haskell тілінің негіздері»

Деректер құрылымы мен олардың типтері

Кез-келген программалау тілінің базалық бірлігі – символ. Символ дегеніміз ұзындығы шектеулі немесе шектеусіз әріптер, символдар және арнайы белгілер тізбегі. Кейбір тілдерде кіші және бас әріптердің айырмашылығы болса, кейбірінде болмайды. Мысалы, Lisp’те кіші және бас әріптердің айырмашылығы жоқ болса, Haskell’де бар.

Символдар көбінесе идентификаторлар – тұрақты, айнымалы, функция аттары ретінде қолданылады. Тұрақты, айнымалы және функциялар таңбалардың типтелген тізбегі болып табылады. Әріптер қатары сандық константаның мәні бола алмайды. Функционалдық тілдерде атом – базалық түсінігі кездеседі. Іс жүзінде атомдар дегеніміз символдар мен сандар.

Функционалдық программалаудың келесі түсінігі – тізімдер. Абстрактілі математикалық қағидада [] символдары қолданылды, ол Haskell’де де қолданылады. Бірақ Lisp’те кәдімгі «дөңгелек» жақшалар қолданылады — (). Lisp’те тізім элементтері бос орын арқылы ажыратылса Haskell’де элементтерді ажырату үшін үтір қолданылады. Сонда, [a, b, c] тізімі Haskell’ синтаксисі бойынша осылай жазылса, Lisp’ қағидасы бойынша (a b c) түріне аудару керек. Бірақ Lisp’ ті жасаушылар жұптарды ұйымдастыру үшін нүктелік жазбаны да қолданып, жоғарыдағы тізімді келесі түрде жазды (a.(b.(c.NIL))).

Lisp’ пен Haskell’де тізімдік құрылымдар - бір тізімді екіншісіне алу қағидасы бойынша сипатталады. Lisp’ қағидасы бойынша, ішкі тізім жақшасының алдына бос орын қалдырмаса да болады.

Функционалдық тілдерде деректер типі автооматты түрде анықталады. Типті автоматты түрде анқтау механизмі Haskell тіліне де енгізілген. Бірақ, кей жағдайда типті көрсету қажет болады, әйтпесе интерпретатор шатасып кетуі мүмкін. Haskell’де арнайы символ қолданылады — :: (екі қос нүкте), ол «типі бар» деп оқылады.

Егер

5 :: Integer

түрінде жазсақ, ол «5 сандық тұрақтысының типі Integer (Бүтін сан)» деп оқылады.

Бірақ Haskell полиморфты типтер, немесе типтер шаблонын да қолдайды. Мысалы, [a] түрінде жазсақ, онда тип «кез-келген тип атомдарының тізімі» деп оқылады, және атомдар типі барлық тізім құру барысында бірдей болу керек. Яғни, [1, 2, 3] және [‘a’, ‘b’, ‘c’] тізімдері [a] типті, ал [1, ‘a’] тізімінің типі басқа болады.

Атау беру бойынша келісімдер

Haskell’де атау беру бойынша келісімдер өте маңызды, себебі олар тілдің синтаксисіне енеді. Ең басты келісім – идентификатор бас әріптен басталуы керек. Тип атаулары да, бас әріптерден басталуы керек. Функциялардың, айнымалы мен тұрақтылардың атаулары кіші әріптерден басталады. Идентификатордың бірінші әріпі ретінде арнайы таңбалар да алынуы мүмкін.

Тізім анықтауыштары мен математикалық тізбектер.

Haskell — қарапайым математикалық формула арқылы оңай, әрі жылдам тізімдер құруға мүмкіндік беретін жалғыз программалау тілі. Бұл тәсіл тізімді жылдам сұрыптау функциясын Хоар әдісімен құру кезінде қолданылған болатын. Тізімді анықтауыштардың жалпы жазылуы келесі түрде болады:

[ x | x <­ xs ]

Бұл жазу былай оқылады «xs-тен алынған барлық х-тер тізімі». «x ← xs» құрылымы генератор деп аталады. Мұндай генератордан кейін үтірмен ажыратылған қандай да бір өрнек мәні тұру керек. Сонда барлық осындай х-тер таңдалып, барлық өрнек мәні үшін орындалады. Жазу келесі түрде болады:

[ x | x <­ xs, x > m, x < n ]

Можно прочитать как «Список из всех таких x, взятых из xs, что (x больше m) И (x

меньше n)».

Haskell’дің тағы бір артықшылығы шексіз тізімдер мен деректер құрылымын құрудың оңайлығы болып табылады. Шексіз тізімдерді тізім анықтауышы негізінде де, арнайы қағида көмегімен де құруға болады. Мысалы, төменде натурал сандар тізбегінен тұратын шексіз тізім көрсетілген. Екінші тізім тақ натурал сандардың тізбегін құрайды.

[1, 2 ..]

[1, 3 ..]

Екі нүкте көмегімен кез-келген шексіз және шектеулі арифметикалық прогрессияларды да анықтауға болады. Егер тізбек шектеулі болса, онда оның бірінші және соңғы эелементтері беріледі. Арифметикалық прогрессияның айырмасы бірінші және екінші берілген элементтер негізінде есептеледі – жоғарыда келтірілген мысалдарда бірінші прогрессиядағы айырма – 1, ал екіншісінде – 2 болады. Сонымен, 10-ға дейінгі барлық тақ натурал сандардың тізімін анықтау үшін келесі тізімді жазу керек: [1, 3 .. 10]. Нәтижесі төмендегі тізім болады:

[1, 3, 5, 7, 9].

Деректердің шексіз құрылымын шексіз тізімдер негізінде де, рекурсия механизмін қолдану арқылы да анықтауға болады. Бұл жағдайда рекурсия рекурсивті функцияларға қатынау түрінде қолданылады. Шексіз деректер құрылымын құрудың үшінші тәсілі шексіз типтерді қолдану арқылы жүргізіледі.

Мысал 1. Екілік бұтақты бейнелейтін типті анықтау.

data Tree a

Branch

Leaf

= Leaf a

| Branch (Tree a) (Tree a)

: Tree a ­> Tree a ­> Tree a

:: a ­> Tree a

Бұл мысалда шексіз типті анықтау тәсілі көрсетілген. Рекурсия қолданылғаны көрініп тұр. Егер деректердің жаңа типін құру қажет болмаса, шексіз құрылымды функцияның көмегімен де алуға болады:

ones

numbersFrom n

= 1 : ones

= n : numberFrom (n + 1)

squares

= map (^2) (numbersFrom 0)

Бірінші функция бірліктерден тұратын шексіз тізбекті анықтайды. Екінші функция берілген саннан бастап, барлық бүтін сандар тізбегін құрады. Үшінші функция нөлмен бірге натурал сандар квадраттарының шексіз тізбегін құрады.

Функцияларды шақыру

Функцияны шақырудың математикалық қағидасы шақыру параметрлерін жақшаға алумен шектелген еді. Бұл қағиданы кейіннен барлық императивті тілдер қолданды. Бірақ функционалдық тілдерде басқа қағида қабылданған – функция атауы оның параметрінен жай бос орын арқылы ажыратылады.

Lisp’те параметрі L length функциясын шақыру келесі тізім түрінде жазылады: (length L). Мұндай қағида функционалдық тілдердегі көптеген функциялар каррирленген екенін көрсетеді. Haskell’де функцияны шақыруды тізім түріне келтірудің қажеттігі жоқ. Мысалы, екі санды қосатын функция анықталған болса:

add

add x y

:: Integer ­> Integer ­> Integer

= x + y

Онда, оны нақты параметрлерімен шақыру келесі түрде болады:

add 5 7

Бұл жерде Haskell’ қағидасы абстрактілі математикалық тіл қағидасына ұқсайтыны көрініп тұр. Бірақ Haskell Lisp’тен ары асып, типі A1 → (A2 → ... (An → B) ... ) түрінде көрсетуге болмайтын, каррирленбеген функияларды да сипаттайтын қағида бар екенін көрсетті. И эта нотация, как и в императивных языках программирования, использует круглые скобки:

add (x, y) = x + y

Соңғы жазу - Haskell’ қағидасы бойынша жазылған бір аргументті функция екенін көруге болады. Екінші жағынан каррирленген функциялар үшін бөліктеп қолданумүмкін болатынын да байқауға болады. Яғни, екі аргументті функцияны шақыру кезінде оған тек біреуін ған берсе жеткілікті.

Бұл құбылысты берілген аргументке бірлік қосып отыратын inc функциясының мысалы арқылы нақтырақ көрсетуге болады:

inc :: Integer ­> Integer

inc = add 1

Бұл жағдайда бір параметрлі inc функциясын шақыру, біріншісі – 1 болатын, екі параметрлі add функциясын шақыруға әкеледі. Бұл бөліктеп қолданудың интуитивті түсінігі. Түсінікті бекіту үшін map функциясының классикалық мысалын қарастыруға болады. Келесі мысалда Haskell’де map функциясы:

map

map f []

map f (x:xs)

:: (a ­> b) ­> [a] ­> [b]

= []

= (f x) : (map f xs)

Мұнда prefix - қос нүкте операциясының инфиксті жазуы қолданылғаны көрініп тұр, жұптарды құру және белгілеу үшін мұндай жазу тек Haskell’ қағидасында ғана қолданылады. Жоғарыдағы анықтаманы келтіргеннен кейін ғана келесі шақыруды жүргізуге болады:

map (add 1) [1, 2, 3, 4]

Нәтижесі [2, 3, 4, 5] түріндегі тізім болады.

­есептеуді қолдану

Программалаудың функционалдық парадигмасы -есептеуге негізделгендіктен, барлық функционалдық тілдердің -абстракцияны сипаттауға арналған қағиданы қолдайтыны заңды құбылыс. Haskell бұл аспектіні де айналып өткен жоқ, қандай да бір функцияны анықтауды, қажет болса -абстракция арқылы жүргізеді. Сонымен қатар -абстракция арқылы жасырын функцияларды да анықтауға болады (Мысалы, бірлік шақыру үшін). Төменде, -есептеулер көмегімен add және inc функцияларын анықтаудың мысалы келтірілген.

Мысал 2. ­ абстракциялар арқылы анықталған add және inc функциялары.

add = \x y ­> x + y

inc = \x ­> x + 1

Мысал 3. Жасырын функцияны шақыру.

сubes = map (\x ­> x * x * x) [0 ..]

Мысал 3 берліген параметрдің кубын есептейтінжасырын функцияны шақыруды көрсетіп тұр. Бұл инструкцияның орындалу нәтижесі, нөлден басталған бүтін сандар кубтарының шексіз тізімі болады. Ескертетін жағдай, Haskell’де  ­ өрнектерді жазудың қысқартылған тәсілі қолданылады, себебі тура қағида бойынша add функциясын келесі түрде жазған дұрысырық болар еді:

add = \x ­> \y ­> x + y

 ­абстракцияның типін анықтау, функцияның типін анықтағандай жүргізіледі. x.expr түріндегі ­өрнектің типі келесі түрде болады T1 → T2, мұндағы T1 - x айнымалысының типі, ал T2 —expr өрнегінің типі.

Функцияны жазудың инфиксті тәсілі

Кейбір функциялар үшін жазудың инфиксті тәсілі қолданылуы мүмкін, ондай функциялар қарапайым бинарлық операциялар сияқты. Мысалы, тізімдерді конкатенациялау мен функцияларды композициялау операциялары анықталған:

Мысал 4. Тізімдерді конкатенациялаудың инфиксті операциясы.

(++) :: [a] ­> [a] ­> [a]

[] ++ ys = ys

(x:xs) ++ ys = x : (xs ++ ys)

Мысал 5. Функцияны композициялаудың инфиксті операциясы.

(.) :: (b ­> c) ­> (a ­> b) ­> (a ­> c)

f . g = \x ­> f (g x)

Haskell’-де инфиксті операциялар функция болып табылатындықтан, олар каррирленген, сондықтан мұндай функцияларды бөліктеп қолдану мүмкіндігін қамтамасыз еткен маңызды. Осы мақсатта, Haskell’де «секция» деп аталатын арнайы жазба қолданылады:

(x ++) = \x ­> (x ++ y)

(++ y) = \y ­> (x ++ y)

(++) = \x y ­> (x ++ y)

Жоғарыда үш секция көрсетілген, олардың әрқайсысы берілген аргументтер санына сәйкес тізімдерді конкатенциялаудың инфиксті операцияларын анықтайды.

Секцияны жазуда дөңгелек жақшаларды қолдану міндетті болып табылады. Егер қандай да бір функция екі параметр қабылдайтын болса, онда оны да инфиксті түрде жазуға болады. Бірақ, жай ғана параметрлер арасына функция атауын жазу – қате деп есептеледі, себебі Haskell’ қағидасы бойынша екі рет қолдану болып қалады және бір қолдануда бір операнд жетіспей қалады. Функцияны инфиксті түрде жазу үшін, оны кері апостроф — ` символына алу қажет.

Қайта анықталған инфиксті операциялар үшін есептеу ретін анықтау мүмкін. Ол үшін Haskell’де infixr қызметші сөзі қолданылады. Қызметші сөз берілген операцияның 0 ден 9-ға дейінгі аралықтағы маңыздылық дәрежесін (орындалу ретін) айқындайды және 9 мұндағы ең жоғарғы маңыздылық дәрежесі болып табылады. 4 және 5 мысалдардағы берілген операциялардың дәрежесі келесі түрде анықталады:

infixr 5 ++

infixr 9 .

Ескертетін жай, Haskell’дегі барлық функциялар қатаң емес, яғни олар есептеулерді кейінге қалдырып есептей алады. Мысалы, егер қандай да бір функция балай анықталса:

bot = bot

Мұндай функцияны шақыру кезінде қате кетеді және ондай қателерді табу қиынға соғады. Бірақ қандай да бір тұрақты функция болса және келесі түрде анықталса:

constant_1 x = 1

Онда (constant_1 bot) конструкциясын шақыру кезінде ешқандай қате кетпейді, себебі бұл жағдайда bot функциясының мәні есептелмейді (есептеу кейінге қалдырылады, өрнектің мәні тек қажет болған жадайда ғана есептеледі). Есептеу нәтижесі 1 саны болатыны анық көрініп тұр.

Зертханалық жұмыстарды орындау реті

Зертханалық жұмысты өткізу үшін қажет шаралар:

1. Вариантына сәйкес тапсырма алу;

2. Тапсырманы өз бетінше орындау;

3. Оқытушыға компьютерде орындап көрсету;

4. Есепті дайындау және өткізу;

5. Жұмысты қорғау.

Есепте міндетті түрде келтірілуі керек:

1. Вариант нөмірі;

2. Тапсырма мәтіні;

3. Орындау ретіне түсініктеме;

4. Программа мәтіні.

Зертханалық жұмысты қорғау есеп материалдарын білімгердің оқытушыға түсіндіруі және сұрақтарға жауап беруі бойынша жүргізіледі.

Зертханалық жұмыс№1. Haskell тілінің негіздері

Жұмыстың мақсаты. Приобрести навыки работы с интерпретатором языка Haskell. Haskel l тілінің негізгі типтері туралы түсінік алу.

Зертханалық жұмыстың тапсырмасы

Келесі типтерге жататын тривиалды емес өрнектерге мысал келтіріңіз (Кемінде 5 мысал). 1) ((Char,Integer), String, [Double])

2) [(Double,Bool,(String,Integer))]

3) ([Integer],[Double],[(Bool,Char)])

4) [[[(Integer,Bool)]]]

5) (((Char,Char),Char),[String])

6) (([Double],[Bool]),[Integer])

7) [Integer, (Integer,[Bool])]

8) (Bool,([Bool],[Integer]))

9) [([Bool],[Double])] 10) [ ( [Integer], [Char] ) ]

10) [( [Integer], [Char] ), (Integer,[Bool])]

Зертханалық жұмыс№2. Haskell тілінің қарапайым функциялары

Жұмыстың мақсаты. Қарапайым функцияларды анықтауды үйрену.

Зертханалық жұмыстың тапсырмасы

Келесі функцияларды анықтаңыз:

1) Функция max3, үш бүтін санның үлкенін қайтаратын функция.

2) Функция min3, үш бүтін санның кішісін қайтаратын функция.

3) Функция sort2, кішісі – бірінші, үлкені – екінші орында тұратындай етіп, екі бүтін санның жұбын қайтаратын функция.

4) Функция bothTrue : : Bool > Bool > Bool, екі аргументі True мәнін қабылдағанда ғана, True мәнін қайтаратын функция. Функцияны анықтау кезінде стандартты логикалық операцияларды (&&, | | и т.п.) қолдануға болмайды.

5) Функция solve2::Double>Double>(Bool,Double), ax + b = 0 сызықтық теңдеуінің коэффициенттерін құрайтын екі сан бойынша, егер шешімі бар болса, бірінші элементі True мәнін қабылдайтын жұпты қайтарады, әйтпесе екінші элементі түбірдің мәніне немесе 0- ге тең False мәнін қабылдайтын жұпты қайтарады.

6) Функция isParallel, функция аргументінде соңғы нүктелері берілген екі кесінді параллель (немесе бір түзудің бойында жатса) болса, True мәнін қайтарады. Мысалы, isParallel (1,1) (2,2) (2,0) (4, 2 ) өрнегінің мәндері True мәнін қабылдауы керек, өйткені (1,1) − (2, 2) и (2, 0) − (4, 2) кесінділері параллель орналасқан.

7) Функция is Included, жазықтықтағы екі шеңбердің параметрлері (центрі мен радиусының координаттары) аргументтері болатын функция True мәнін қайтарады, егер екінші шеңбер толықтай бірінші шеңбердің ішінде жатса.

8) Функция isRectangular, параметрлері ретінде жазықтықтағы үш нүктенің координаттарын қабылдайды және True мәнін қайтарады, егер пайда болған үшбұрыш – тік бұрышты болса.

9) Функция is Triangle, х, у және z ұзындықтарымен берілген кесінділерден үшбұрыш тұрғызуға болады не болмайтынын анықтайды.

10) Функция isSorted, кірісте үш сан қабылдап, True мәнін қайтарады, егер олар өсуі не кемуі бойынша реттелген болса.

Зертханалық жұмыс№3. Haskell тіліндегі рекурсивті функциялар.

Жұмыстың мақсаты. Рекурсивті функцияларды анықтауды үйрену. Үлгімен сәйкестендіру механизмі бойынша түсінік алу.

Зертханалық жұмыстың тапсырмасы

  1. Кірісте n бүтін санын қабылдайтын және өсуі бойынша реттелген, n элементтен тұратын тізімді қайтаратын функцияны анықтау керек.

1) Натурал сандар тізімі.

2) Тақ натурал сандар тізімі.

3) Жұп натурал сандар тізімі.

4) Натурал сандардың квадраттарының тізімі.

5) Факториалдар тізімі.

6) Екінің дәрежелерінің тізімі.

7) Үштің дәрежелерінің тізімі.

8) Нартурал сандардың кубтарының тізімі.

9) Үшбұрышты сандар тізімі.

(nе үшбұрышты сан tn әр қабырғасында n монетадан болатын тең бүйірлі үшбұрышты тұрғызуға болатын бірдей монеталар санына. Мұнда, t1 = 1 и tn = n + tn−1)

10) Пирамидалы сандар тізімі (nе пирамидалы сан pn әр қабырғасында n шардан болатын үшбұрышты жасаушысы бар пирамиданы тұрғызуға болатын бірдей шарлар санына тең.Мұнда, p1 = 1 и pn = tn + pn−1).

2 Келесі қатарлардың N-ші элементін есептейтін функцияларды құру керек.

1. F (x, n) = xn

2. F (x, n) = xn+3/n

3. F (x, n) = (x+x2)n

4. F (n) =

5. F (n) =

6. F (n) =  i = 1,p n­i

7. F (n) = 2n

8. F (n) = 3n

9. F (n) = en =

10. F (n) = nn

Зертханалық жұмыс№4. Haskell тіліндегі тізімдер .

Жұмыстың мақсаты. Тізімдерді өңдеуге арналған функцияларды анықтау дағдыларын қалыптастыру.

Зертханалық жұмыстың тапсырмасы

1 Келесі шексіз тізімдерді құру керек.

1) Натурал сандар тізімі.

2) Тақ натурал сандар тізімі.

3) Жұп натурал сандар тізімі.

4) Натурал сандардың квадраттарының тізімі.

5) Факториалдар тізімі.

6) Екінің дәрежелерінің тізімі.

7) Үштің дәрежелерінің тізімі.

8) Нартурал сандардың кубтарының тізімі.

9) Үшбұрышты сандар тізімі.

(nе үшбұрышты сан tn әр қабырғасында n монетадан болатын тең бүйірлі үшбұрышты тұрғызуға болатын бірдей монеталар санына. Мұнда, t1 = 1 и tn = n + tn−1)

10) Пирамидалы сандар тізімі (nе пирамидалы сан pn әр қабырғасында n шардан болатын үшбұрышты жасаушысы бар пирамиданы тұрғызуға болатын бірдей шарлар санына тең. Мұнда, p1 = 1 и pn = tn + pn−1).

2 Келесі функцияларды анықтаңыз.

1) Кірісте нақты сандар тізімін қабылдайтын және олардың арифметикалық ортасын есептейтін функцияны анықтаңыз. Функция тізімді бір рет қана тексеріп өтетіндей етіп есептеу жүргізу керек.

2) Берілген тізімнен n –ші эелементті ақтайтын функция.

3) Екі тізімнің элементтерін қосу функциясы. Тізім параметрлері элементтерінің қосындысынан тұратын тізімді қайтарады. Берліген тізімдердің ұзындықтары әртүрлі болатынын да ескеру керек.

4) Берілген тізімдегі көршілес жұп және тақ элементтердің орнын ауыстыру функциясы.

5) Функция removeOdd, берілген бүтін сандар тізімінен барлық тақ сандарды жояды. Мысалы: removeOdd [1,4,5,6,10], нәтижесі [4,10].

6) Функция removeEmpty, берілген қатарлар тізімінен бос қатарларды жояды.

Мысалы:

removeEmpty ["", "Hello", "", "", "World!"], нәтижесі ["Hello", "World!"].

7) Функция countTrue : [Bool] > Integer , True мәнін қабылдайтын тізім элементтерінің санын қайтарады.

8)Функция makePositive, сандар тізіміндегі теріс элементтердің таңбасын өзгертеді, мысалы: makePositive [1, 0, 5, 10, 20], нәтижесі [1,0,5,10,20]

9) Функция delete : : Char > String > String , қатар мен символды қабылдайды және қатарда кездесетін символды жойып, қалған қатарды қайтарады. Мысалы:

delete ' l' "Hello world! ", нәтижесі "Heo word!".

10) Функция substitute :: Char > Char > String > String тізімдегі көрсетілген символды берілген символға ауыстырады. Мысалы: substitute 'e' 'i' "eigenvalue" нәтижесі "iiginvalui"

Зертханалық жұмыс№5. Haskell тілінде тізімдер мен жолдарды өңдеу.

Жұмыстың мақсаты. Тізімдер мен қатарларды өңдеу дағдысын қалыптастыру. Зертханалық жұмыстың тапсырмасы

1. addStars :: [String] -> [String]

Берілген тізім қатарынан, тізімнің әр қатарының басына '*' («жұлдызша») символын қосып, жаңа тізім құру.

2. hasLetters :: [String] -> Int

Құрамында ең болмағанда бір әріп кездесетін, тізімдегі қатарлар санын анықтау (әріп дегеніміз isAlpha :: Char ­> Bool функциясы True мәнін қабылдайтын символ).

3. hasString :: [String] -> String -> Bool

Бірінші аргументпен берілген тізімнің қатарында, екінші аргументпен берілген қатарға сәйкес келетін қатардың кезедесетінін анықтау керек.

4. firstSymbols :: [String] -> String

Тізім элементтері – қатардың алғашқы символдарынан тұратын қатарды құру керек (бос орындарды өткізіп жіберу керек).

5. replaceToFirst :: [String] -> [String]

Берілген қатарлар тізімінен, бастапқы қатардың бірінші символдарынан құралған қатардан тұратын жаңа тізім алу керек. Бос орындарды өзгеріссіз қалдыру керек.

6. removeLong :: [String] -> Int -> [String]

Қатарлардың берілген тізімінен (бірінші аргумент) керек екінші аргументпен берілген мән ұзындығынан асатын қатарлардан басқа қатардан тұратын жаңа қатар құру.

7. truncateList :: [String] -> Int -> [String]

По заданному списку строк (первый аргумент) составить новую строку, содержащую те же строки, укороченные до длины, заданной вторым аргументом. Строки, длина которых меньше или равна второго аргумента, оставить без изменения.

8. longest :: [String] -> String

Тізімдегі ең ұзын қатарды табу керек.

9. shortest :: [String] -> String

Тізімдегі ең қысқа қатарды табу керек.

10. bracketsOnly :: [String] -> [String]

'[' символынан басталып ']' символымен аяқталатын бастапқы тізімнің үш қатарынан тұратын жаңа тізім құру керек.

11. removeStars :: [String] -> [String]

Бастапқы тізімнің '*' («жұлдызша») символынан басталатын қатарларынан басқа қалған қатарларынан жаңа тізім құру керек.

12. startsWithDigit :: [String] -> Int

Тізімдегі цифрдан басталатын қатарлар санын анықтау керек (цифр деп isDigit :: Char ­> Bool функциясыTrue мәнін қабылдайтын символды айтамыз).

13. notEmpty :: [String] -> Int

Тізімдегі бос қатарлар санын табу керек.

14. numLongs :: [String] -> Int -> Int

Тізімдегі мәні екінші аргумент ұзындығынан асатын қатарлар санын анықтау керек.

15. allDigits :: [String] -> Int

Тізімдегі тек цифрлардан тұратын қатарлар санын анықтау керек (цифр деп isDigit :: Char ­> Bool функциясыTrue мәнін қабылдайтын символды айтамыз).

16. onlyLetters :: [String] -> [String]

Берілген тізімнің тек әріптерден ғана тұратын қатарларынан жаңа тізім құру керек (әріп дегеніміз isAlpha :: Char ­> Bool функциясы True мәнін қабылдайтын символ).

17. lastSymbols :: [String] -> String

Тізім элементтерінің – соңғы символдары қатарынан жаңа қтара құру керек (бос қатарларды өткізіп жіберу керек).

18. removeShortest :: [String] -> [String]

Берілген тізімнің ең қысқа қатарынан басқасынан қатарлар тізімін құру керек .Егер бастапқы тізім бос болса, онда нәтижесі де бос тізім болады; егер ұзындығы ең қысқа қатарлар бірнеше болса – олардың біреуін (кез-келгенін) жою керек.

19. remove :: [String] -> String -> [String]

Қатарлардың берілген тізімінен (алғашқы аргумент) екінші аргументпен сәйкес келетін қатардан басқалары арқылы жаңа қатар құру керек.

20. removeLongest :: [String] -> [String]

Берілген тізімдегі ең ұзын қатрадан басқаларынан жаңа қатарлар тізімін құру керек. Егер бастапқы тізім бос болса, онда нәтижесі де бос тізім болады; егер ұзындығы ең ұзын қатарлар бірнеше болса – олардың біреуін (кез-келгенін) жою керек.

21. hasEmpty :: [String] -> Bool

Тізімдегі ұзындығы нөлге тең қатарларды анықтау.

Зертханалық жұмыс№6. Haskell тіліндегі деректердің күрделі құрылымын өңдеу

Жұмыстың мақсаты. Деректердің күрделі құрылымын анықтау және өңдеу дағдысын қалыптастыру.

Зертханалық жұмыстың тапсырмасы

Еркін құрылым бұтағының деректер типін сипаттауы келесі түрде болады:

data Tree a = Node a [Tree a]

яғни, бұтақтың әр түйінін екінші қатралы бұтақтардан тұрады. Бұтақтарды өңдеудің келесі функцияларын анықтау керек.

1. toList :: Tree a ­> [a]

Бұтақтың барлық түйіндерінің тізімін құрады (реті маңызды емес).

2. hasElement :: Eq a => Tree a ­> a ­> Bool

Бұтақ түйіндерінің арасында, құрамында екінші аргументтің мәні кездесетін бірінші аргументпен берілген түйіннің бар екендігін анықтайды.

3. sumTree :: Real a => Tree a ­> a

Бұтақ түйіндерінде сақталған мәндер қосындысын есептейді.

4. isHeap :: Ord a => Tree a ­> Bool

Бұтақтың пирамида болатыны рас екендігін дәлелдейді, яғни екініш қатарлы түйіндерде сақталған мәндердің оның әр түйінінде кездесетін мәндерден кіші екенідігін дәлелдейді. 5. levelList :: Tree a ­> Int ­> [a]

Екінші аргументпен берілген нөмір деңгейінде жатқан, бұтақ түйіндері мәндерінің тізімін құрайды.

6. height :: Tree a -> Int

Бұтақтың биіктігін анықтайды.

7. maxElement :: Ord a => Tree a ­> a

Бұтақтағы ең үлкен элементті табады.

8. minElement :: Ord a => Tree a ­> a

Бұтақтағы ең кіші элементті табады.

9. deepElements :: Tree a ­> Int ­> [a]

Екінші аргументпен берілген деңгейден кіші емес деңгейде жатқан, бұтақ мәндерінің тізімін құрайды.

10. rootElements :: Tree a ­> Int ­> [a]

Екінші аргументпен берілген деңгейден жоғары емес деңгейде жатқан, бұтақ мәндерінің тізімін құрайды.

11. allEven :: Tree Integer ­> Bool

Бұтақтың барлық түйіндері тек жұп сандардан тұратыны рас екендігін тексереді.

12. hasNegatives :: Tree Integer ­> Bool

Бұтақ түйіндері арасында теріс сандардан тұратын түйіндер бар екендігін тексереді.

13. isSuperHeap :: Real a => Tree a ­> Bool

Бұтақ түйіндерінде сақталған мәндердің әрқайсысы, осы түйіндердің екінші қатарлы бұтақтарының қосындысының түбірінен (егер ол бар болса) кіші екендігі рас екенін тексереді.

14. allOdds :: Tree Integer ­> Bool

Бұтақтың барлық түйіндері тек тақ сандардан тұратыны рас екендігін тексереді.

15. isHeap :: Ord a => Tree a ­> Bool

Бұтақ пирамида болып табылатындығы рас екенін тексереді, ол үшін оның әр түйініндегі мәндер, осы түйіннің екінші қатарлы бұтақтарында сақталған мәндерден кіші болуы керек

16. levelList :: Tree a ­> Int ­> [a]

Екінші аргументпен берілген нөмір деңгейінде жатқан, бұтақ түйіндері мәндерінің тізімін құрайды.

17. height :: Tree a -> Int

Бұтақ биіктігін анықтайды.

18. rootElements :: Tree a ­> Int ­> [a]

Екінші аргументпен берілген деңгейден аспайтын деңгейде жатқан, бұтақ түйіндері мәндерінің тізімін құрайды.

19. maxElement :: Ord a => Tree a ­> a

Бұтақтағы ең үлкен элементті табады.

20. minElement :: Ord a => Tree a ­> a

Бұтақтағы ең кіші элементті табады.