Re[12]: Мифический Haskell
От: FR  
Дата: 20.02.12 11:20
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>В месте ссылочной прозрачности. И я не считаю, что "более декларативен" осмысленное словосочетание. Язык или декларативен или нет (императивен).


Слово "декларативный" все-таки тут плохо подходит, у него слишком много значений, ты слишком сужаешь его смысл.
Ни к чему кроме терминологических споров это не приведет.
Хотя термин подобрать сложно, "аппликативный" вроде тоже не совсем подходит, остается только громоздкое "чисто функциональный".
Re[13]: Мифический Haskell
От: Klapaucius  
Дата: 20.02.12 11:56
Оценка:
Здравствуйте, FR, Вы писали:

FR>Слово "декларативный" все-таки тут плохо подходит


Не согласен, подходит хорошо.

FR>, у него слишком много значений, ты слишком сужаешь его смысл.


Я не зауживаю его смысл. Лямбда-исчисление декларативно (это, по-моему, очевидное следствие теоремы Черча-Россера) в числе прочего. Но расширения, нарушающие ссылочную прозрачность типа мл-ных рефов делают его недекларативным — т.е. императивным. Поэтому хаскель, в котором таких расширений нет декларативен, а смл — императивен. Аналогично и с логическими языками: основа пролога — дизъюнкты Хорна — декларативна, но расширение красными катами делает пролог императивным языком (в отличие от меркюри, например).

FR>Ни к чему кроме терминологических споров это не приведет.


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

FR>Хотя термин подобрать сложно, "аппликативный" вроде тоже не совсем подходит, остается только громоздкое "чисто функциональный".


Но декларативными бывают не только чисто функциональные языки! С.м. выше.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[16]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 20.02.12 12:08
Оценка:
Здравствуйте, vshabanov, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>In computer programming, a function may be described as pure if both these statements about the function hold:


S>> The function always evaluates the same result value given the same argument value(s). The function result value cannot depend on any hidden information or state that may change as program execution proceeds or between different executions of the program, nor can it depend on any external input from I/O devices.

S>> Evaluation of the result does not cause any semantically observable side effect or output, such as mutation of mutable objects or output to I/O devices.
S>>[/q]

V>Если внешний мир является параметром ф-ии и, измененный "побочным" эффектом, мир возвращается результатом (а больше ничего нигде не меняется), то ф-ия является чистой. У нее нет побочных эффектов -- она работает с миром как с обычным аргументом и результатом, а не опосредованно.

Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат? Только без всяких "если".

S>>Мне кажется, что ты неправильно себе это представляешь. Функции в хаскеле не оперируют с миром (я о тех, которые не считаются бэкдорами типа unsafePerformIO). Функции в хаскеле оперируют action-ами. Как оперирующие action-ами, они формально чисты. Но сами action-ы не являются чистыми.


V>Я в самом начале приводил ссылку на сорцы ghc-шной библиотеки, где, не считая некоторых внутренних оптимизаций, IO a = World -> (a, World). Т.е. эти самые action-ы тоже обычные ф-ии. И также формально чисты, т.к. явно принимают мир в качестве аргумента и возвращают измененный мир, не меняя ничего кроме.

Они не могут быть формально чисты, т.к. кроме экземпляра World, портят и остальной мир, в том числе содержимое консоли. Кроме как от экземпляра World, зависят еще от того, что пользователь введет в консоль. И как меня не уговаривай, экземпляр World не имеет в себе отражения того, что происходит в реальном мире.

S>>То есть ты говоришь что функции чисты, если представить такой хороший внутренний мир. Но тут же говоришь что им приходится работать с внешним миром. Тогда наверное они не так уж и чисты, как ты предлагаешь считать?


V>Поинт в том, что в Хаскеле даже монада IO, которая кажется нечистой, также является чистой ф-ей. Просто у нее аргумент необычный ), но формально она чистая.

Если так, то функция из C
World *printf(LPCSTR, World *)

тоже становится формально чистой
И вообще тогда это определение чистоты никому особо не нужно, т.к. любую нечистоту можно убрать добавлением фиктивного параметра.

S>>Т.е. когда action-ы перфомятся, тогда они взаимодействуют с миром, плодят эффекты, получают недетерминированные результаты. Но программе на хаскеле нет нужды их перфомить вручную. Это сделает рантам, получив экшн как результат чистого вычисления main и подав ему мир.


V>Ну и? Сама-то IO для хаскелла так и остается чистой ф-ией.

Нет, и в указанной тобой книге об этом написано. В процитированном мной абзаце не написано о формальной чистоте, но написано что выполнение действий зависит от мира и оставляет эффект в мире в external world или world outside the program. Надеюсь, что очевидно, что они пишут не о World, который есть внутренность программы.

S>>А что нам мешает так подумать с любой функцией в императивном программировании? Ну и что что мир не фигурирует в параметрах функции, считаем его зафиксированным, получаем что любая функция детерминирована


V>Ничего не мешает. Важно то, что мир не является здесь параметром. Значит ф-ия зависит не только от своих аргументов, значит нечистая.

Выше я уже предложил добавить в printf фиктивный параметр. Она по-твоему стала формально чистой?

S>>Если GETDATE будет возвращать один и тот же результат, нафиг она нужна, ее можно заменить константой!


V>Хорошо, запускаем БД вместе с операционкой в эмуляторе железа. Хоп и всегда одинаковый результат )

Я по умолчанию функции рассматриваю не в эмуляторе, где она дает одинаковый результат.

V>Тут вопрос не в том, нужна/не нужна GETDATE. Важно, что принципиально для любой "нечистой" ф-ии (включая любую программу, набитую нечиствми ф-иями) можно сделать такой мир, что она будет выдавать один и тот же результат и менять мир одним и тем же образом. Тогда, если этот мир является параметром и результатом, то ф-ия является чистой (просто она мир использует/меняет, но он всего лишь один из агрументов).

Тут как раз важно то, что нечистые функции взаимодействуют с существующим миром, а не с тем, который можно сделать. Мысленный перенос мира в границы программы не позволяет просто так задвинуть на чистоту. Ведь после этого миру программы все равно придется взаимодействовать с миром вне программы. Т.е. мысленный перенос мира не влияет на I/O через границы программы.
Re[17]: Мифический Haskell
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 20.02.12 14:50
Оценка:
Здравствуйте, samius, Вы писали:

V>>Если внешний мир является параметром ф-ии и, измененный "побочным" эффектом, мир возвращается результатом (а больше ничего нигде не меняется), то ф-ия является чистой. У нее нет побочных эффектов -- она работает с миром как с обычным аргументом и результатом, а не опосредованно.

S>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат? Только без всяких "если".

Да

S>>>Мне кажется, что ты неправильно себе это представляешь. Функции в хаскеле не оперируют с миром (я о тех, которые не считаются бэкдорами типа unsafePerformIO). Функции в хаскеле оперируют action-ами. Как оперирующие action-ами, они формально чисты. Но сами action-ы не являются чистыми.


V>>Я в самом начале приводил ссылку на сорцы ghc-шной библиотеки, где, не считая некоторых внутренних оптимизаций, IO a = World -> (a, World). Т.е. эти самые action-ы тоже обычные ф-ии. И также формально чисты, т.к. явно принимают мир в качестве аргумента и возвращают измененный мир, не меняя ничего кроме.

S>Они не могут быть формально чисты, т.к. кроме экземпляра World, портят и остальной мир, в том числе содержимое консоли. Кроме как от экземпляра World, зависят еще от того, что пользователь введет в консоль. И как меня не уговаривай, экземпляр World не имеет в себе отражения того, что происходит в реальном мире.

S>>>То есть ты говоришь что функции чисты, если представить такой хороший внутренний мир. Но тут же говоришь что им приходится работать с внешним миром. Тогда наверное они не так уж и чисты, как ты предлагаешь считать?


V>>Поинт в том, что в Хаскеле даже монада IO, которая кажется нечистой, также является чистой ф-ей. Просто у нее аргумент необычный ), но формально она чистая.

S>Если так, то функция из C
S>
S>World *printf(LPCSTR, World *)
S>

S>тоже становится формально чистой

Да.

S>И вообще тогда это определение чистоты никому особо не нужно, т.к. любую нечистоту можно убрать добавлением фиктивного параметра.


Только если в Си всегда можно подставить NULL или два раза вызвать на одном и том же "мире", то в хаскеле так нельзя. Мир подается аргументом только в main, и работать с ним можно только через bind. В результате чего мы продолжаем работать в чисто функциональном haskell, но при этом можем писать императивный код.

Т.е. в Си, добавив world к printf ничего не добъешься, т.к. язык не позволяет правильно ограничить его использование, а в хаскеле все чики-пики.

S>>>Т.е. когда action-ы перфомятся, тогда они взаимодействуют с миром, плодят эффекты, получают недетерминированные результаты. Но программе на хаскеле нет нужды их перфомить вручную. Это сделает рантам, получив экшн как результат чистого вычисления main и подав ему мир.


V>>Ну и? Сама-то IO для хаскелла так и остается чистой ф-ией.

S>Нет, и в указанной тобой книге об этом написано. В процитированном мной абзаце не написано о формальной чистоте, но написано что выполнение действий зависит от мира и оставляет эффект в мире в external world или world outside the program. Надеюсь, что очевидно, что они пишут не о World, который есть внутренность программы.

Но в программе мир моделируется тем самым World.

S>>>А что нам мешает так подумать с любой функцией в императивном программировании? Ну и что что мир не фигурирует в параметрах функции, считаем его зафиксированным, получаем что любая функция детерминирована


V>>Ничего не мешает. Важно то, что мир не является здесь параметром. Значит ф-ия зависит не только от своих аргументов, значит нечистая.

S>Выше я уже предложил добавить в printf фиктивный параметр. Она по-твоему стала формально чистой?

Если она ничего кроме этого праметра больше не трогает, то стала. Но, т.к. параметр по-сути фиктивный и меняется реальный мир, то, чтобы сохранить чистую семантику, требуется чтобы этот параметр нельзя было использовать более одного раза. Тут то и вылезают монады с do-нотацией, которые позволяют это удобно сделать.

S>>>Если GETDATE будет возвращать один и тот же результат, нафиг она нужна, ее можно заменить константой!


V>>Хорошо, запускаем БД вместе с операционкой в эмуляторе железа. Хоп и всегда одинаковый результат )

S>Я по умолчанию функции рассматриваю не в эмуляторе, где она дает одинаковый результат.

V>>Тут вопрос не в том, нужна/не нужна GETDATE. Важно, что принципиально для любой "нечистой" ф-ии (включая любую программу, набитую нечиствми ф-иями) можно сделать такой мир, что она будет выдавать один и тот же результат и менять мир одним и тем же образом. Тогда, если этот мир является параметром и результатом, то ф-ия является чистой (просто она мир использует/меняет, но он всего лишь один из агрументов).

S>Тут как раз важно то, что нечистые функции взаимодействуют с существующим миром, а не с тем, который можно сделать. Мысленный перенос мира в границы программы не позволяет просто так задвинуть на чистоту. Ведь после этого миру программы все равно придется взаимодействовать с миром вне программы. Т.е. мысленный перенос мира не влияет на I/O через границы программы.
Re[14]: Мифический Haskell
От: alex_public  
Дата: 20.02.12 14:57
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>Аналогично и с логическими языками: основа пролога — дизъюнкты Хорна — декларативна, но расширение красными катами делает пролог императивным языком (в отличие от меркюри, например).

...
K>Но декларативными бывают не только чисто функциональные языки! С.м. выше.

Кстати, Mercury обычно называют фунционально-логическим языком. И насколько я помню он потерял значительную часть мощи Пролога в этой своей мутации. Поэтому я отбросил его, когда я пытался найти современного наследника Пролога.

Вот здесь http://habrahabr.ru/blogs/prolog/122147/ например разница заметна. Там в начале статьи как раз ссылки на другие варианты есть... И можно сравнить Mercury vs Prolog vs Haskell.
Re: Мифический Haskell
От: alex_public  
Дата: 20.02.12 14:59
Оценка:
http://habrahabr.ru/blogs/python/138546/ — наткнулся на забавную статью в тему обсуждения. )))
Re[12]: Мифический Haskell
От: korvin_  
Дата: 20.02.12 19:59
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>От схемеров и коммон-лисперов.


Скорее от любителей холиваров, на них можно не обращать внимания. =)

K>Ну, в моей двухосевой классификации (чисто) функциональные языки — декларативные, функциональные.


По твоей классификации масло -- жирное, масляное. Так что ли?
Re[18]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.12 04:15
Оценка:
Здравствуйте, vshabanov, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат? Только без всяких "если".


V>Да

Это учитывая текущую "реализацию" мира?

S>>Если так, то функция из C

S>>
S>>World *printf(LPCSTR, World *)
S>>

S>>тоже становится формально чистой

V>Да.

Не согласен

S>>И вообще тогда это определение чистоты никому особо не нужно, т.к. любую нечистоту можно убрать добавлением фиктивного параметра.


V>Только если в Си всегда можно подставить NULL или два раза вызвать на одном и том же "мире", то в хаскеле так нельзя. Мир подается аргументом только в main, и работать с ним можно только через bind. В результате чего мы продолжаем работать в чисто функциональном haskell, но при этом можем писать императивный код.


V>Т.е. в Си, добавив world к printf ничего не добъешься, т.к. язык не позволяет правильно ограничить его использование, а в хаскеле все чики-пики.


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

S>>Нет, и в указанной тобой книге об этом написано. В процитированном мной абзаце не написано о формальной чистоте, но написано что выполнение действий зависит от мира и оставляет эффект в мире в external world или world outside the program. Надеюсь, что очевидно, что они пишут не о World, который есть внутренность программы.


V>Но в программе мир моделируется тем самым World.

Это не модель. Это затычка, dummy.
При этом, как бы мир не моделировался в самой программе, программе все еще приходится взаимодействовать с миром вне программы. И любое такое взаимодействие нечисто по определению.

S>>Выше я уже предложил добавить в printf фиктивный параметр. Она по-твоему стала формально чистой?


V>Если она ничего кроме этого праметра больше не трогает, то стала. Но, т.к. параметр по-сути фиктивный и меняется реальный мир, то, чтобы сохранить чистую семантику, требуется чтобы этот параметр нельзя было использовать более одного раза. Тут то и вылезают монады с do-нотацией, которые позволяют это удобно сделать.

Монады — лишь способ протащить мир по вычислениям. В printf можно было бы ограничить использование мира другим способом, например проверкой его счетчика использований и возвратом кода ошибки (или исключения в C++). Механизм ограничения числа использований параметра вообще не имеет никакого отношения к определению чистоты.
Re[19]: Мифический Haskell
От: vshabanov http://vshabanov-ru.blogspot.com
Дата: 21.02.12 08:47
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, vshabanov, Вы писали:


V>>Здравствуйте, samius, Вы писали:


S>>>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат? Только без всяких "если".


V>>Да

S>Это учитывая текущую "реализацию" мира?

Нет

S>>>Если так, то функция из C

S>>>
S>>>World *printf(LPCSTR, World *)
S>>>

S>>>тоже становится формально чистой

V>>Да.

S>Не согласен

Ну что ж, ты конечно имеешь право на собственное мнение )

S>>>И вообще тогда это определение чистоты никому особо не нужно, т.к. любую нечистоту можно убрать добавлением фиктивного параметра.


V>>Только если в Си всегда можно подставить NULL или два раза вызвать на одном и том же "мире", то в хаскеле так нельзя. Мир подается аргументом только в main, и работать с ним можно только через bind. В результате чего мы продолжаем работать в чисто функциональном haskell, но при этом можем писать императивный код.


V>>Т.е. в Си, добавив world к printf ничего не добъешься, т.к. язык не позволяет правильно ограничить его использование, а в хаскеле все чики-пики.


S>В хаскеле мы работаем чисто функционально не от того что мир нельзя подать дважды в один метод. А от того, что вручную не форсируем выполенение нечистых дейсвтвий, а лишь комбинируем нечистые действия чистым образом.


Да да, конечно )

S>>>Нет, и в указанной тобой книге об этом написано. В процитированном мной абзаце не написано о формальной чистоте, но написано что выполнение действий зависит от мира и оставляет эффект в мире в external world или world outside the program. Надеюсь, что очевидно, что они пишут не о World, который есть внутренность программы.


V>>Но в программе мир моделируется тем самым World.

S>Это не модель. Это затычка, dummy.
S>При этом, как бы мир не моделировался в самой программе, программе все еще приходится взаимодействовать с миром вне программы. И любое такое взаимодействие нечисто по определению.

Безусловно )

S>>>Выше я уже предложил добавить в printf фиктивный параметр. Она по-твоему стала формально чистой?


V>>Если она ничего кроме этого праметра больше не трогает, то стала. Но, т.к. параметр по-сути фиктивный и меняется реальный мир, то, чтобы сохранить чистую семантику, требуется чтобы этот параметр нельзя было использовать более одного раза. Тут то и вылезают монады с do-нотацией, которые позволяют это удобно сделать.

S>Монады — лишь способ протащить мир по вычислениям. В printf можно было бы ограничить использование мира другим способом, например проверкой его счетчика использований и возвратом кода ошибки (или исключения в C++). Механизм ограничения числа использований параметра вообще не имеет никакого отношения к определению чистоты.

Возврат ошибки/исключение на том же мире -- уже нечистая ф-ия.

Покури unique types что-ли. Может так станет понятно про то, что при гарантии однократного использования параметра/результата сохраняется ссылочная прозрачность.
Re[11]: Мифический Haskell
От: Паблик Морозов  
Дата: 21.02.12 09:51
Оценка:
Здравствуйте, alex_public, Вы писали:

>html генерятся у нас с помощью xslt шаблонов из xml данных


Re[13]: Мифический Haskell
От: Klapaucius  
Дата: 21.02.12 11:22
Оценка:
Здравствуйте, korvin_, Вы писали:

_>Скорее от любителей холиваров, на них можно не обращать внимания. =)


А что, кто-то не любит холиворы? Быть такого не может!

_>По твоей классификации масло -- жирное, масляное. Так что ли?


Разве ж это я виноват, что бывает еще и масло обезжиренное? Под "функциональный" я понимаю все-таки поддержку для функциональной декомпозиции в языке — т.е. первоклассные функции. Ограничивать число функциональных языков чисто функциональными (которых всего-то три, не считая совсем экспериментальные, причем один уже мертв, а второй собирается стать диалектом третьего) я считаю неправильным. Практики из этих языков, путь с оговорками, костылями и подпорками все-таки применимы в ФЯ в широком смысле.
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[17]: Мифический Haskell
От: Паблик Морозов  
Дата: 21.02.12 11:28
Оценка: :))) :))
Здравствуйте, samius, Вы писали:

>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат?


Да.

>Только без всяких "если".


Если ты передал в функнию значение уникального типа, ты его не получишь назад.
Если ты передал в функнию значение уникального типа, ты его не получишь назад.
И твоя голова всегда в ответе за то, куда сядет твой зад.
"Ссылка на мир всегда одна" —
Это сказал Филипп Вадлер,
или какой-то другой
Профессор с бородой.
Re[12]: Мифический Haskell
От: alex_public  
Дата: 21.02.12 15:06
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

>>html генерятся у нас с помощью xslt шаблонов из xml данных


ПМ>


А? ) Кстати, xslt как раз очень хорошо относится к этому форуму — явно декларативный. )))
Re[13]: Мифический Haskell
От: Паблик Морозов  
Дата: 21.02.12 15:54
Оценка:
Здравствуйте, alex_public, Вы писали:

_>А? ) Кстати, xslt как раз очень хорошо относится к этому форуму — явно декларативный. )))


Лично я плохо отношусь к решению задач через жопу. И к xslt тоже. Потому что делать язык программирования из языка разметки, который изначально предназначался для машины, это тоже через жопу.
Re[14]: Мифический Haskell
От: alex_public  
Дата: 21.02.12 16:27
Оценка: +1
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Лично я плохо отношусь к решению задач через жопу. И к xslt тоже. Потому что делать язык программирования из языка разметки, который изначально предназначался для машины, это тоже через жопу.


В смысле синтаксиса согласен. Но других то инструментов с сопоставимыми возможностями не видно. Только всякие кривые домашние велосипеды. А у xslt один docbook чего стоит. )
Re[15]: Мифический Haskell
От: Паблик Морозов  
Дата: 21.02.12 16:33
Оценка:
Здравствуйте, alex_public, Вы писали:

_>Но других то инструментов с сопоставимыми возможностями не видно.


Если речь едёт о генерации http-страничек, то инструмент с сопоставимы возможностями называется похапе.
Re[16]: Мифический Haskell
От: alex_public  
Дата: 21.02.12 16:59
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Если речь едёт о генерации http-страничек, то инструмент с сопоставимы возможностями называется похапе.


Ээээ, наверное имелось в виду html-страничек? А то http-странички — это что-то мне не знакомое. )))

А так, ничего даже близкого на php (даже если забыть, что это жутчайший язык сам по себе) нет. Скажем на xslt у меня код в две строки генерирует chm файл из xml файла. Другие две строки генерируют полноценный "сайт" (с навигацией и т.п.) из того же xml файла. А ещё другие две строки (ну там может чуть больше) генерируют красиво оформленный pdf из того же xml файла. Не знаю как сделать тоже самое на php таким же количеством кода. )))
Re[13]: Мифический Haskell
От: alexlz  
Дата: 21.02.12 19:00
Оценка:
Здравствуйте, alex_public, Вы писали:

_>А? ) Кстати, xslt как раз очень хорошо относится к этому форуму — явно декларативный. )))

Ага, "язык функционального программирования с нечеловеческим лицом" (автора не помню)
Re[20]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.12 20:19
Оценка:
Здравствуйте, vshabanov, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>>>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат?


V>>>Да

S>>Это учитывая текущую "реализацию" мира?

V>Нет

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

S>>>>Если так, то функция World *printf(LPCSTR, World *) тоже становится формально чистой


V>>>Да.

S>>Не согласен

V>Ну что ж, ты конечно имеешь право на собственное мнение )

Да, иногда пользуюсь этим правом.
Хотелось бы избежать любой напряженности, потому сделаю отступление в этом месте.
Мнение мое сложилось отнюдь не в результате глубокого изучения вопроса или применения каких-то аналитических способностей. Просто в данный момент я так вижу и так понимаю. Право иметь собственное мнение немного для меня стоит без того что бы проверить это мнение а прочность путем столкнования с отличными от моего мнениями. Но в то же время, для меня это не спорт. Т.е. предпочту иметь более правильное, аргументированное мнение, чем свое собственное.
Так же признаю за оппонентом право не способствовать мне в проверке прочности моего мнения и приму любую причину этого не делать, в том числе нежелание или отсутствие времени/возможности. А при наличии желания+возможности предлагаю в неспешном комфортном режиме навести ясность в этом вопросе (не исключаю, что и в моей голове).

V>>>Т.е. в Си, добавив world к printf ничего не добъешься, т.к. язык не позволяет правильно ограничить его использование, а в хаскеле все чики-пики.


S>>В хаскеле мы работаем чисто функционально не от того что мир нельзя подать дважды в один метод. А от того, что вручную не форсируем выполенение нечистых дейсвтвий, а лишь комбинируем нечистые действия чистым образом.


V>Да да, конечно )

Отлично. Исходная точка найдена. Теперь надо выяснить, имеет ли способ ограничения повторного использования мира к определению чистоты. Имеет ли значение, как ограничивается повторное использование, будь это возможность компилятора, библиотеки, или честное слово в документации?

V>>>Но в программе мир моделируется тем самым World.

S>>Это не модель. Это затычка, dummy.
S>>При этом, как бы мир не моделировался в самой программе, программе все еще приходится взаимодействовать с миром вне программы. И любое такое взаимодействие нечисто по определению.

V>Безусловно )

Рад, еще одна точка понимания. Дальше ход такой: имеет ли значение, как называется тип мира? Метафора, конечно важна. Но чисто формально наш мир мог бы называться Dummy, Foo, или Foo9278345987. И чисто формально уже не важно, какую связь с миром имеет этот параметр. Важно лишь то, что каким-то образом ограничена возможность повторного использования экземпляра.

V>>>Если она ничего кроме этого праметра больше не трогает, то стала. Но, т.к. параметр по-сути фиктивный и меняется реальный мир, то, чтобы сохранить чистую семантику, требуется чтобы этот параметр нельзя было использовать более одного раза. Тут то и вылезают монады с do-нотацией, которые позволяют это удобно сделать.

S>>Монады — лишь способ протащить мир по вычислениям. В printf можно было бы ограничить использование мира другим способом, например проверкой его счетчика использований и возвратом кода ошибки (или исключения в C++). Механизм ограничения числа использований параметра вообще не имеет никакого отношения к определению чистоты.

V>Возврат ошибки/исключение на том же мире -- уже нечистая ф-ия.

Согласен, формально это уже impure. Но, при стечении хороших обстоятельств, при правильном использовании, мы избежим кодов возврата, исключений и т.п. Тогда сможем говорить о некой относительной чистоте. Но на самом деле мы говорим о нечистоте вывода. Т.е. я убежден в том, что никакие средства, в том числе изменения компилятора, не позволят сделать ввод/вывод или взаимодействие с внешним миром относительно самой программы чистым.

V>Покури unique types что-ли. Может так станет понятно про то, что при гарантии однократного использования параметра/результата сохраняется ссылочная прозрачность.

Тут опять таки есть разные точки приложения ссылочной прозрачности. По определению ссылочная прозрачность выражения — это возможность заменить вычисление выражения результатом без изменения поведения программы.
Важно понимать, что при замене функций ввода-вывода со внешним миром значениями, программа перестанет взаимодействовать с внешним миром. Внешнее поведение программы изменится. Потому, ни о какой ссылочной прозрачности в отношении внешнего поведения программы речи быть не может.
О какой же тогда ссылочной прозрачности толкуют в uniqueness typing? ИМХО, они говорят о ссылочной прозрачности в отношении внутреннего поведения программы. Уникальные типы позволяют делать деструктивное обновление параметра в случае World->(a, World), и только лишь. Для внутренностей программы и только для них, все выглядит как будто бы мы получили новый экземпляр мира (пусть и на месте старого). Для внутренностей программы не имеет значения, вызывали ли мы взаимодействие со внешним миром, или просто получили вместо старого мира кортеж с новым миром. В этом отношении ссылочная прозрачность имеет место. Но как только мы вспоминаем о взаимодействии с внешним миром, оказывается что такая замена не является прозрачной.

Итого, uniqueness typing это лишь один из способов гарантировать невозможность повторного использования экземпляра с приятной особенностью, позволяющей делать замену по месту. Никакой чистоты при взаимодействии с внешним миром оно не обеспечивает.
Re[18]: Мифический Haskell
От: samius Япония http://sams-tricks.blogspot.com
Дата: 21.02.12 20:29
Оценка:
Здравствуйте, Паблик Морозов, Вы писали:

ПМ>Здравствуйте, samius, Вы писали:


>>Ответь, дважды примененный результат getLine к одному и тому же миру даст одинаковый резльутат?


ПМ>Да.


>>Только без всяких "если".


ПМ>Если ты передал в функнию значение уникального типа, ты его не получишь назад.

ПМ>Если ты передал в функнию значение уникального типа, ты его не получишь назад.
В хаскеле ведь тип не уникален. Согласен, что монада нам нужна лишь для того что бы не юзать дважды один мир. Но будь возможность заюзать мир дважды, сохранение результата не гарантируется.

ПМ>И твоя голова всегда в ответе за то, куда сядет твой зад.

ПМ>"Ссылка на мир всегда одна" -
ПМ>Это сказал Филипп Вадлер,
ПМ>или какой-то другой
ПМ>Профессор с бородой.
Это лирика, если считать что представление внешнего мира внутри программы ничем не лучше чем Foo.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.