Кіріспе

Компьютерде бірегей тип объектінің бір ғана жіпте қолданылуын және оған ең көп дегенде бір сілтеме болуын қамтамасыз етеді. Егер мәннің бірегей түрі болса, оған қолданылатын функция объектінің машиналық кодын тікелей жаңарту арқылы оңтайландырылуы мүмкін. Мұндай тікелей жаңартулар функционалдық тілдердің тиімділігін арттырып, референциялық ашықтықты сақтайды. Бірегей типтер функционалдық және императивті бағдарламалауды интеграциялау үшін де қолданылуы мүмкін.

Кіріспе

Бірегейлік типтеуді мысалмен түсіндіруге болады. ReadLine функциясы берілген файлдың келесі мәтін жолын оқиды:

функция readLine(File f) қайтарады String
return line where
String line = doImperativeReadLineSystemCall(f)
end
end

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

функция readLine2(unique File f) қайтарады (unique File, String)
return (differentF, line) where
String line = doImperativeReadLineSystemCall(f)
File differentF = newFileFromExistingFile(f)
end
end

«unique» декларациясы f түрінің бірегей екенін көрсетеді; яғни, readLine2 функциясы қайтарылғаннан кейін шақырушы readLine2 функциясына f аргументі ретінде қайтадан жіберілмейді, және бұл шектеу типтік жүйемен күшіне енгізіледі. readLine2 функциясы f-ті қайтармайды, керісінше, жаңа, басқа файл объектісі differentF-ті қайтарады, бұл readLine2 функциясын f аргументімен қайта шақыру мүмкін емес екенін білдіреді, осылайша сілтемелік ашықтықты сақтай отырып, жанама әсерлерге жол береді.

Бағдарламалау тілдері

Бірегейлік типтері Clean, Mercury, SAC және Idris сияқты функционалдық бағдарламалау тілдерінде қолданылады. Кейде олар функционалдық тілдерде монадтардың орнына I/O операцияларын жүзеге асыру үшін пайдаланылады. Scala бағдарламалау тілі үшін акторлар арасындағы хабар алмасу кезінде бірегейлікті басқаруға арналған аннотацияларды қолданатын компилятор кеңейтуі жасалды.

Сызықтық типтеумен байланысы

Бірегей тип сызықтық типке өте ұқсас, сондықтан осы терминдер көбінесе бір-бірінің орнына қолданылады, бірақ бұл ретте нақты айырмашылық бар: нақты сызықтық типтеу, сызықтық емес мәнді сызықтық формаға түрлендіруге мүмкіндік береді, әрі оған бірнеше сілтеме сақталады. Бірегейлік мәннің басқа сілтемелері жоқ екеніне кепілдік береді, ал сызықтық – мәнге жаңа сілтемелер жасалмауына кепілдік береді. Сызықтық пен бірегейлік, сызықтық емес және бірегейлік емес мүмкіндіктермен салыстырғанда ерекше көзге түседі, бірақ оларды бір типтік жүйеде біріктіруге де болады.