Информация об изменениях

Сообщение Re[16]: Ввод-вывод и чистые функции от 31.01.2017 7:55

Изменено 31.01.2017 7:59 D. Mon

Re[16]: Ввод-вывод и чистые функции
Здравствуйте, novitk, Вы писали:

N>От меня ускользает смысл. ТС вроде за аннотацию, ты вроде тоже. 99% в D это обычные грязные функции без аннотации и написать на нем чистую функцию реально нельзя, так как комбинаторы тянут грязь. То есть по факту pure в нем не додумана и не используется.


Это ваши выводы не додуманы. Никакую грязь комбинаторы не тянут, их отлично себе можно использовать в чистом коде.

N>>>И два map-a это не решение проблемы, потому что потом нужно два fold-а и вообще всего в std.algorithm или как оно там называется,


Не нужно. Чистота там выводится автоматически.

N>Как мне g переделать в грязную? Я надеюсь какой-то лифтинг все же есть и мне не надо переписывать g еще раз.


int f(int i) pure {
    return i*i;
}
int h(int i) {
    writeln("Bad");
    return i*i;
}

int g(alias func)() {
    return func(10);
}

int makeSureWeReStillPure() pure {
    return g!f + 1;
}

void main(string[ ] args)
{
    writeln(g!f); 
    writeln(g!h); 
    writeln(makeSureWeReStillPure());
}

100
Bad
100
101
Re[16]: Ввод-вывод и чистые функции
Здравствуйте, novitk, Вы писали:

N>От меня ускользает смысл. ТС вроде за аннотацию, ты вроде тоже. 99% в D это обычные грязные функции без аннотации и написать на нем чистую функцию реально нельзя, так как комбинаторы тянут грязь. То есть по факту pure в нем не додумана и не используется.


Это ваши выводы не додуманы. Никакую грязь комбинаторы не тянут, их отлично себе можно использовать в чистом коде.

N>>>И два map-a это не решение проблемы, потому что потом нужно два fold-а и вообще всего в std.algorithm или как оно там называется,


Не нужно. Чистота там выводится автоматически.

N>Как мне g переделать в грязную? Я надеюсь какой-то лифтинг все же есть и мне не надо переписывать g еще раз.


int f(int i) pure {
    return i*i;
}
int h(int i) {
    writeln("Bad");
    return i*i;
}

int g(alias func)() { // автоматически чистая или грязная в зависимости от func
    return func(10);
}

int makeSureWeReStillPure() pure {
    return g!f + 1;
}

void main(string[ ] args)
{
    writeln(g!f); 
    writeln(g!h); 
    writeln(makeSureWeReStillPure());
}

100
Bad
100
101