Сообщение Re[115]: Мнение: объектно-ориентированное программирование — от 15.11.2019 11:51
Изменено 15.11.2019 13:31 artelk
Re[115]: Мнение: объектно-ориентированное программирование —
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, artelk, Вы писали:
A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>Это, конечно, условно — но для иллюстрации поведения сойдёт.
Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.
Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
При наличие хаскелообразного ленивого исполнителя (чтобы только одна ветка исполнения отрабатывала в рантайме), все будет так же чисто и стерильно.
S>Здравствуйте, artelk, Вы писали:
A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>public struct World
S>{
S> private string[] _out;
S> private string[] _in;
S> private World(string[] in, string[] out)
S> public World PutStr(string line)
S> {
S> var newOut = new string[_out.Count+1];
S> Array.Copy(_out, newOut, _out.Count);
S> newOut[_out.Count] = line;
S> return new World(_in, newOut);
S> }
S> public (string, World) GetStr()
S> {
S> var newIn = new string[_in.Count-1];
S> Array.Copy(_in, newIn, 1, _in.Count-1);
S> return (_in[0], new World(newIn, _out);
S> }
S>}
S>S>Это, конечно, условно — но для иллюстрации поведения сойдёт.
Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.
Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
public struct World
{
private World()
public World PutStr(string line)
{
Console.WriteLine(line);
return new World();
}
public (string, World) GetStr()
{
return (Console.ReadLine(), new World());
}
}При наличие хаскелообразного ленивого исполнителя (чтобы только одна ветка исполнения отрабатывала в рантайме), все будет так же чисто и стерильно.
Re[115]: Мнение: объектно-ориентированное программирование —
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, artelk, Вы писали:
A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>Это, конечно, условно — но для иллюстрации поведения сойдёт.
Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.
Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
При наличие хаскелообразного ленивого (upd: а также считающего все функции чистыми и агрессивно кэшируещего их результаты) исполнителя (чтобы только одна ветка исполнения отрабатывала в рантайме), все будет так же чисто и стерильно.
S>Здравствуйте, artelk, Вы писали:
A>>Пожалуйста! Но я все же настаиваю, что для Хаскела тот факт, что возвращается именно трансформация, а не ее результат, не принципиален в вопросе о чистоте. Внутренняя гипотетическая функция transform там тоже чиста. Она детерминирована (весь Мир передается ей в качестве параметра) и не делает никаких сайд-эффектов (т.к. все ее "эффекты" вовсе не "сайд", а включены в возвращаемое значение).
S>Эмм, просто наше определение сайд-эффектов — это как раз взаимодействие с "миром".
S>В приведённом коде world играет чисто номинальное значение; в более строгом подходе (как я его понимаю) у нас нет класса Console.
S>У нас есть что-то типа
S>
S>public struct World
S>{
S> private string[] _out;
S> private string[] _in;
S> private World(string[] in, string[] out)
S> public World PutStr(string line)
S> {
S> var newOut = new string[_out.Count+1];
S> Array.Copy(_out, newOut, _out.Count);
S> newOut[_out.Count] = line;
S> return new World(_in, newOut);
S> }
S> public (string, World) GetStr()
S> {
S> var newIn = new string[_in.Count-1];
S> Array.Copy(_in, newIn, 1, _in.Count-1);
S> return (_in[0], new World(newIn, _out);
S> }
S>}
S>S>Это, конечно, условно — но для иллюстрации поведения сойдёт.
Согласен. Но у меня World вообще internal, как в Хаскеле. Так что пишем мой вариант, а имеем ввиду ваш — главное, чтоб для вызывающего кода работало как ваш вариант.
Для клиенсткого кода нужно запретить использовать класс Console (и прочие I/O классы) напрямую, без нашей IO обертки, и вот мы уже на полпути к Хаскелу.
Впринципе, можно сделать World открытым.
(По сигнатурам и семантике идентично вашему, а в реализации другое.)
public struct World
{
private World()
public World PutStr(string line)
{
Console.WriteLine(line);
return new World();
}
public (string, World) GetStr()
{
return (Console.ReadLine(), new World());
}
}При наличие хаскелообразного ленивого (upd: а также считающего все функции чистыми и агрессивно кэшируещего их результаты) исполнителя (чтобы только одна ветка исполнения отрабатывала в рантайме), все будет так же чисто и стерильно.