Современные информационные технологии/ 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