2011-04-28 3 views
22

На мой взгляд, сила функциональной чистоты заключается в том, что глубокие кодовые пути можно проверить как свободные от побочных эффектов. Каковы опыты людей в масштабе дерева кодов, которые могут находиться внутри чистого спецификатора, и каков уровень повторного использования кода?Чисто функциональное программирование в D

Несколько вещей, которые я заметил:

std.algorithm в основном, не помеченный как pure, но потенциально может быть в значительной степени чистыми, либо чистой версией алгоритмов, требующих чистоту функции инстанцирования или Mixin, либо чистота сам спецификатор статически полиморфен.
Полезные преобразователи, такие как to!string(someInt), в настоящее время не чисты.

определенного пользователь Структуры, кажется, есть проблемы (как показано ниже): 1.
чистых деструкторов на вложенную структуру
2. чистая функция postblit даже на невложенную структуру

Следующего кода в настоящее время дает несколько ошибок на DMD 2,052 выиграть 32-битном

struct InnerStruct 
{ 
    pure this(this) {} 
    pure ~this() {} 
} 

struct OuterStruct 
{ 
    InnerStruct innerStruct; 
    pure this(this) {} 
    pure ~this() {} 
} 

pure void somePureFunc() 
{ 
    OuterStruct s1 = OuterStruct(); // pure nested destructor does not compile 
    OuterStruct s2 = s1; 
    InnerStruct is1 = InnerStruct(); // pure non-nested destructor seems to compile 
    InnerStruct is2 = is1; // pure non-nested postblit does not compile 
} 

void main() 
{ 
    somePureFunc(); 
} 
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '__cpctor' 
pure_postblit.d(20): Error: pure function 'somePureFunc' cannot call impure function '__cpctor' 
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '~this' 
pure_postblit.d(17): Error: pure function 'somePureFunc' cannot call impure function '~this' 

ответ

21

в теории точка pure в D является то, что она должна позволить гу что функция является побочным эффектом, независимо от того, как эта функция реализована. Есть два вида чистоты в D:

  • Все функции, отмеченные pure слабо чистые. Они не могут получить доступ к глобальному изменяемому состоянию (глобальные переменные, переменные потока, переменные static и т. Д.) Или выполнить ввод-вывод. Однако они могут изменить свои аргументы. Точка этих функций состоит в том, что они могут быть вызваны из сильно чистых функций (подробно ниже), не нарушая гарантий сильной чистоты.

  • Все функции, которые слабо чисты и, не имеют аргументов с изменяемой косвенностью, являются сильно чистыми. Для этого можно использовать конструкторы типа const и immutable. (При работе со структурами и классами указатель this считается параметром.) Сильно чистые функции обладают всеми хорошими свойствами, о которых говорят функциональные программисты, даже если они реализованы с использованием изменяемого состояния. Сильно чистая функция всегда возвращает одно и то же значение для любых заданных аргументов и не имеет наблюдаемых побочных эффектов. Сильно чистые функции являются ссылочно прозрачными, то есть их возвращаемое значение может быть заменено вызовом к ним с заданным набором параметров, не влияя на наблюдаемое поведение. Любая сильно чистая функция может быть безопасно выполнена параллельно с любой другой сильно чистой функцией.

К сожалению, взаимодействие между обобщенным кодом и pure (а также const и immutable) довольно бедна. Было высказано несколько предложений по исправлению этого вопроса, но никто еще не был принят.
\ std.algorithm записывается как можно более общий, поэтому он не может требовать, чтобы его лямбда-функции и диапазоны, которые он принимает, были чистыми. Кроме того, функции системы типов, которые были добавлены в D2, как правило, являются самыми ошибками в языке, потому что более основные вещи были приоритетными перед устранением соответствующих проблем. Прямо сейчас, pure в основном не используется, за исключением тривиальных случаев, таких как std.math.

+0

Спасибо за ваши комментарии. Я заметил слабое определение чистоты в то время, когда экспериментирую, и это явно очень мощно, позволяя полное программируемое программирование OO в чистом коде, а также при создании ленивых оценочных шутов или планировании обещаний и т. Д. Сильную форму можно легко утверждать мета -программирование на классификаторах типов. Я думаю, что для высококонкурентного видения, чтобы действительно взлететь, гораздо больше нужно быть в чистом конверте. Проблемы деструктора и postblit, о которых я упоминал, больше всего влияют на меня, поскольку мне нужно ссылаться на счет в чистом коде, вы думаете, что это ошибки? – John

+0

@John: Да, это, наверное, ошибки. – dsimcha

Смежные вопросы