Выразительность.

Nov 19, 2009 23:47

В Харрисоне и Филде (одна из первых книг про функциональное программирование на русском) рассказывается об интересном факте. Я по памяти, поэтому могу наврать, но не думаю, что сильно ошибусь.

Комбинаторы SKI могут выразить любое лямбда-выражение, есть даже правила преобразования туда и обратно. Беда заключается в том, что длина выражения в базисе SKI будет пропорциональна экспоненте от длины выражения в нотации лямбда-исчисления, O(eN).

Пишем 2+2, получаем N букв SKI. Пишем 2+1+1, получаем 2N букв. Пишем 1+1+1+1, 4N букв.

С этим пытались бороться, добавляя комбинаторы и базис комбинаторов SKIBC-и-ещё-какой-то-я-забыл-какой даёт всего лишь квадратичное увеличение длины.

А суперкомбинаторы, вытягиваемые из самой программы, позволяют записать программу в линейное (от длины программы) количество "букв".

В принципе, SKI, SKIBC+что-то-ещё и суперкомбинаторы можно считать языками программирования с разной выразительной силой.

Надеюсь, это показывает, насколько важной может быть возможность языка. Пусть пример достаточно искусственен (и я могу плохо помнить), но зато он нагляден и бьёт по мозгам получаемыми размерами программ: O(eN), O(N2) и O(N).

Да даже последних двух хватит, если я с первой оценкой неправ.

PS
Я же пытался писать на Эпиграме. Так вот, первое, на что я наткнулся, это на квадратичную сложность программы: для типа data Char = CA | CB ... CZ я пытался выразить равенство, а поскольку Эпиграм разворачивает сравнение с образцом в тотальное сравнение, то для eq a b я получил сперва набор всех ветвей для параметра a, а потом в каждой из них должен было написать результат сравнения со свеми результатами b. Хотя всем известно, что равенство может быть записано линейно от количества конструкторов.

epigram, функциональное программирование, языки программирования

Previous post Next post
Up