Современные информационные технологии/ 2.Вычислительная техника и программирование

Бурлибаева Ш.М.

Бірнеше мәндерді қайтаратын Хаскель функциялары

 

Haskell  тіліндегі бағдарламалар өрнек түрінде ұсынылады, олардың есептеулері мәнге әкеледі. Әр мән типі болады. Типті интуитивті түрде өрнектің көптеген бола алатын  мәндері ретінде түсінуге болады. Кейбір мағынаның  типін түсіну үшін, интерпретатордың :type (или :t) командасын қолдануға болады. Одан бөлек, интерпретатор есептелінген әр нәтиженің  типін автоматты түрде басып отыру үшін,  :set +t  командасын орындауға болады.

Haskell тілінің негізгі типтері болып табылады:

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

ü     Float және Double типтері нақты сандарды ұсыну үшін қолданылады.

ü     Bool типі екі мағынаны қамтиды: True және False, логикалық мағыналардың нәтижесін ұсынуға арналған.

ü     Char типі белгілерді ұсыну үшін қолданылады.

Haskell тіліндегі типтер атауы үнемі бас әріптерден басталады.

Haskell тілі  өте типтелінген бағдарламалау тілі болып табылады. Сондай бола тұра көп жағдайда бағдарламалаушы онымен енгізілген айнымалылар қандай типке жататынын хабарлауға міндетті емес. Интерпретатордың өзі қолданушының қабылдайтын айнымалылардың типтерін шығара алады.

Бірақ, кейбір мақсаттар үшін хабарлау керек болса, кейбір мәндер кейбір типтерге жататын болса, : түріндегі конструкция қолданылады, :: айнымалы тип. Егер +t  интерпретатор опциясы қосылса, ол мәнді  сол форматта басады.

Төменде интерпретатормен жұмыстың хаттама сессиясына мысал келтірілген. Prelude>, кейінгі шақырылған мәтінді қолданушы енгізеді, ал одан кейінгі мәтін жүйе жауабын ұсынады деп есептеледі.

Prelude>:set +t

Prelude>1

1 :: Integer

Prelude>1.2

1.2 :: Double

Prelude>’a’

’a’ :: Char

Prelude>True

True :: Bool

Берілген хаттамадан мынадай қорытынды жасауға болады, Integer, Double және Char типтерінің мәні Си тіліндегі ережелер сияқты беріледі.

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

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

decons :: Stream a -> (a, Stream a)

decons (a :& as) = (a, as)

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

f :: a -> (b1, b2)

g :: b1 -> (c1, c2)

h :: b2 -> (c3, c4)

Котежсіз қарапайым функциялар сияқты біз оларды біріктіре аламаймыз.

q x = (\(a, b) -> (g a, h b)) (f x)

Жұптар болған жағдайда біз first пен second функцияларды қолданамыз:

q = first g . second h . f

 Егер q – дан басқа функцияны құрастыратын болсақ, онда  жағдай қиындалады. Кортеж қайтаратын функциялардың басқа функциялармен біруктіруі күрделі болады. Сондықтан, егер функция бірнеше мәндерді қайтаратын болса, онда оны тек бір мәнді қайтаратын функцияларға бөлу керек. Бұл мәндердің арақатынасы тығыз байланысқан және бұл функцияны бірнеше компонентке бөлуге мүмкіндік болмайтын жағдай жиі туады. Егер бұндай функциялар көп болса, онда деректердің жаңа типтерін құру қажет болады. Мысалы, жазықтағы нүкте ретінде (Float, Float) жұпты қолдануға болады. Бұл жағдайда нүктелермен берілетін және нүктелерді қайтаратын функциялар көп пайда болады:

rotate :: Float -> (Float, Float) -> (Float, Float)

norm :: (Float, Float) -> (Float, Float)

translate :: (Float, Float) -> (Float, Float) -> (Float, Float)

Бұлардың барлығы кортеждерді қайтарады. Ал егер жаңа типтердің анықтауын енгізсек:

data Point = Point Float Float

data Vector = Vector Float Float

data Angle = Angle Float

Функциялар түрлері қысқа және нақты болады.

rotate :: Angle -> Point -> Point

norm :: Point -> Point

translate :: Vector -> Point -> Point

 

ПАЙДАЛАНҒАН ӘДЕБИЕТТЕР

1.     С.В. Зыков.  Введение в теорию программирования. Функциональный подход

2.     Л.В. Городняя. Основы функционального программирования

3.     С. Сильван. Сильные стороны языка Haskell

4.     Новицкая Ю.В. Основы логического и функционального программирования (учебное пособие). Новосибирск, 2006