Итерате - Iteratee

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

Әрбір қадамда қайталану мүмкін болатын үш типтің біреуімен ұсынылады: келесі мәліметтер бөлігі, деректер жоқтығын көрсететін мән немесе қайталану процесі аяқталған мән. Қоңырау шалушыға бұдан әрі не істеу керектігін көрсету үшін, ол мүмкін болатын үш типтің бірін қайтара алады: біреуі «тоқтату» дегенді білдіреді (және қайтарудың соңғы мәнін қамтиды), біреуі «жалғастыру» дегенді білдіреді (және жалғастыру жолын көрсетеді). және «қате туралы сигнал беру» дегенді білдіреді. Іс жүзіндегі мәндердің соңғы түрлері қайталанудың мүмкін «күйлерін» білдіреді. Қайталау әдетте «жалғастыру» күйінде басталады.

Итераттар қолданылады Хаскелл және Скала (ішінде Framework ойнаңыз[1] және Скалаз ), сондай-ақ қол жетімді F #.[2] Итерациялардың әртүрлі сәл өзгешелігі бар. Мысалы, Play шеңберінде олар қатысады Фьючерстер сондықтан асинхронды өңдеуді жүзеге асыруға болады.

Итерациялар оларды деректермен қамтамасыз ететін басқа кодпен аталатындықтан, олар мысал бола алады басқарудың инверсиясы. Алайда, көптеген басқа инверсия мысалдарынан айырмашылығы, мысалы SAX XML талдауы, қайталану процесті бақылаудың шектеулі көлемін сақтайды. Ол кері бұрылып, алдыңғы деректерге қарай алмайды (егер ол бұл деректерді іште сақтамаса), бірақ ол лақтырмай-ақ процесті тоқтата алады. ерекшелік (ерекше жағдайларды құрал ретінде пайдалану басқару ағыны, ерекше оқиға туралы сигнал берудің орнына, көбінесе бағдарламашылар оны жек көреді[3]).

Әдетте байланыстырылған абстракциялар

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

Санақшылар

Ан Санақшы - деректерді ерікті деректер көзінен алынған қайталануға беру үшін ыңғайлы абстракция. Әдетте санақшы деректер көзімен байланысты кез келген қажетті ресурстарды тазартумен айналысады. Иператор деректерді оқуды аяқтаған кезде санақшы дәл білетіндіктен, ол ресурстарды тазартуды (мысалы, файлды жабу) дәл уақытында - ерте де емес, кеш те де орындайды. Алайда, ол мұны итерацияның орындалуы туралы білместен немесе онымен бірге болмай-ақ жасай алады, сондықтан санақшылар мен қайталаушылар мысал бола алады алаңдаушылықты бөлу.

Санамалайды

Ан Санау - бұл не санағыштың, не итерацияның шығуын түрлендіруге және осы өнімді итерацияға беруге ыңғайлы абстракция. Мысалы, «карта» санамақ болады карта әрбір кіріс бөлігінің үстіндегі функция.[4]

Мотивтер

Итераталар бұрыннан бар проблемаларға байланысты құрылды таза функционалды жасау мәселесіне арналған шешімдер кіріс шығыс композициялық, бірақ дұрыс. Haskell-тегі жалқау енгізу-шығару таза функциялардың дискідегі деректерді жадтағыдай жұмыс жасауына мүмкіндік берді, файлды ашқаннан кейін мүлдем енгізу-шығаруды жасамады - жадпен салыстырылған файл ерекшелігі - бірақ жалпы мүмкін емес болғандықтан (өйткені Мәселені тоқтату ) файлдың немесе басқа ресурстың әлі де қажет екенін білу үшін жұмыс уақыты үшін файлдардың артық саны қажетсіз ашық қалуы мүмкін, нәтижесінде файл дескрипторы кезінде сарқылу операциялық жүйе деңгей. Дәстүрлі C -шығару-енгізу стилі, керісінше, тым төмен деңгейде болды және өңдеушіден файлдың қазіргі позициясы сияқты төменгі деңгейдегі бөлшектермен байланысты болуын талап етті, бұл композиттілікке кедергі келтірді. Итератилер мен санақшылар жалқау енгізу-шығару бағдарламалық жасақтамасының жоғары деңгейлі артықшылықтарын, ресурстарды басқару және C деңгейіндегі енгізу-шығару мүмкіндігі бар төмен деңгейдегі бөлшектерді басқару қабілетімен біріктіреді.[5]

Мысалдар

Қолданады

Итераттар ойын шеңберінде деректерді ұзақ уақытқа жіберу үшін қолданылады Құйрықты жұлдыз және WebSocket байланыстары веб-шолғыштар.

Iteratees өсімді орындау үшін де қолданылуы мүмкін талдау (яғни барлық деректерді жадқа бірден оқымайтын талдау), мысалы JSON.[6]

Алайда, қайталанулар өте жалпы абстракция болып табылады және ерікті типтер үшін қолданыла алады дәйекті ақпаратты өңдеу (немесе аралас дәйекті / кездейсоқ қол жетімді өңдеу) - және ешқандай енгізу-шығаруды қажет етпейді. Бұл желіден түсетін деректердің орнына жадтағы деректер жиынтығында қайталануды қайталауды жеңілдетеді.

Тарих

Белгілі бір түрде, деректерді бір немесе бірнеше итерация тізбегіне итермелейтін санақшы ұғымының алғы шебері құбыр операциялық жүйелердегі түсінік. Алайда, әдеттегі құбырдан айырмашылығы, итерациялар жеке процестер емес (демек, үстеме шығындар болмайды) IPC ) - немесе тіпті бөлек жіптер, бірақ олар бір-біріне хабарлама жіберетін жұмысшы жіптер тізбегіне ұқсас жұмысты орындай алады. Бұл итерация процестерге немесе жіптерге қарағанда жеңілірек екенін білдіреді - бөлек процестермен немесе жіптермен жағдайларға қарағанда, қосымша стектердің қажеті жоқ.

Итераттер мен санақшылар ойлап тапты Олег Киселев қолдану үшін Haskell.[5] Кейінірек олар Scalaz-ке (5.0 нұсқасында; санаушылар жоқ және Scalaz 7-де енгізілген) және Play Framework 2.0-ге енгізілді.

Ресми семантика

Итераттер формальды түрде модельденді ақысыз монадалар, теңдеулер заңдарын бекітуге және қайталанатын жүйелерді қолданып бағдарламаларды оңтайландыру үшін қолдануға мүмкіндік береді.[5]

Балама нұсқалар

  • Скалада итераторлардың орнына итераторлар қолданылуы мүмкін, бірақ олар бар императивті, сондықтан емес таза функционалды шешім.
  • Хаскеллде «Кондукторлар» және «Құбырлар» деп аталатын екі балама абстракциялар жасалды. (Бұл құбырлар жүйенің деңгейіндегі құбырлар емес, сондықтан итерация сияқты олар пайдалануды қажет етпейді жүйелік қоңыраулар ). Конденсаторлар примитивтер мен комбинаторлардың итератирленгенге қарағанда едәуір бай кітапханаларымен байланысты; HTML, XML, жалпылама талдау, HTTP сұрауларын жасау және жауаптарды өңдеу сияқты қосымша функционалдылық үшін өткізгіш адаптерлер бар, олар Haskell-тегі өндірістік бағдарламалық жасақтаманы қайталауға қарағанда қолайлы өткізгіштерді шығарады.
  • Сонымен қатар жоғары деңгейлі абстракция бар машиналар. Скалада пакет бар FS2: Scala үшін функционалды ағындар, оның шығу тегі бірнеше порт, қайта атау және рефакторлар арқылы машиналардан бастау алады.
  • Хаскеллде пакет қауіпсіз-жалқау-io бар. Ол кейбір қажетті мәселелерді қарапайымырақ шешуге мүмкіндік береді, ол, негізінен, қажет болған немесе қажет болуы мүмкін барлық деректерді аяқтау кезінде ресурстарды тазартуды қамтамасыз ететін құбыр арқылы тарту үшін «жеткілікті қатаңдықты» білдіреді.

Әдебиеттер тізімі

  1. ^ «Деректер ағындарын реактивті қолдану». Framework құжаттамасын ойнаңыз. Алынған 29 маусым 2013.
  2. ^ «Github іздеу нәтижелері: Iteratee in FSharpx».
  3. ^ «Java теориясы мен практикасы: ерекше жағдайлар туралы пікірталас». IBM developerWorks. Алынған 17 мамыр 2014.
  4. ^ «Санақ». Рамалық құжаттаманы ойнаңыз. Алынған 29 маусым 2013.
  5. ^ а б c Киселев, О. (2012). «Итераттар». Логикалық бағдарламалау. Информатика пәнінен дәрістер. 7294. 166–181 бет. дои:10.1007/978-3-642-29822-6_15. ISBN  978-3-642-29821-9.
  6. ^ Джеймс Ропер (2012 жылғы 10 желтоқсан). «Json.scala». қосымша ойындар. Алынған 29 маусым 2013.

Әрі қарай оқу

Сыртқы сілтемелер