Size: a a a

2019 December 30

NV

Nikita Vilunov in ErlangRus
На самом деле можно подойти с другой стороны: если функция возвращает IO a, а не просто a, она может быть вызвана только в другой функции, которая возвращает некий IO b, но не в чистой функции в b.
источник

NV

Nikita Vilunov in ErlangRus
При этом чистые функции могут быть вызваны и внутри IO, и из других чистых функций
источник

ŹR

Źmićer Rubinštejn in ErlangRus
Źmićer Rubinštejn
На самом деле, детерминированность IO это такая производная детерминированность, уровня «любая функция, исходный код которой не меняется во время работы программы детерминированна, потому что это набор инструкций для рантайма»
При таком подходе вообще все функции чистые, а тестирование проверяет не изменился ли ast функции
источник

PG

Pïg Grëënëst in ErlangRus
Nikita Vilunov
На самом деле можно подойти с другой стороны: если функция возвращает IO a, а не просто a, она может быть вызвана только в другой функции, которая возвращает некий IO b, но не в чистой функции в b.
Контрпример: pure :: a -> IO a
источник

NV

Nikita Vilunov in ErlangRus
Pïg Grëënëst
Контрпример: pure :: a -> IO a
И?
источник

AB

Alex Bubnov in ErlangRus
Nikita Vilunov
На самом деле можно подойти с другой стороны: если функция возвращает IO a, а не просто a, она может быть вызвана только в другой функции, которая возвращает некий IO b, но не в чистой функции в b.
это описание следствия, а не причины
источник

PG

Pïg Grëënëst in ErlangRus
Ничто не мешает мне вызвать pure в чистой функции
источник

NV

Nikita Vilunov in ErlangRus
Alex Bubnov
это описание следствия, а не причины
Следствие — это то что важно, если я буду описывать причину, то ворвутся рамблеры и будут говорит что я вдаюсь в детали языка
источник

AB

Alex Bubnov in ErlangRus
Pïg Grëënëst
Контрпример: pure :: a -> IO a
это какая-то unsafe-магия, да?
источник

NV

Nikita Vilunov in ErlangRus
Pïg Grëënëst
Ничто не мешает мне вызвать pure в чистой функции
Да, но её значение либо не будет использовано и соответственно не произведет эффекта, либо твоя вызывающая функция будет возвращать IO
источник

PG

Pïg Grëënëst in ErlangRus
Alex Bubnov
это какая-то unsafe-магия, да?
Наоборот
источник

AB

Alex Bubnov in ErlangRus
а, блин, я сигнатуру неправильно прочел, туплю
источник

NV

Nikita Vilunov in ErlangRus
Результат функции pure уже нельзя будет использовать в чистой функции
источник

PG

Pïg Grëënëst in ErlangRus
Причина простая, IO непрозрачный тип, матчиться по нему нельзя, апи для работы с ним ограничен, вот и все
источник

AB

Alex Bubnov in ErlangRus
Alex Bubnov
а, блин, я сигнатуру неправильно прочел, туплю
я ее перепутал с unsafePerformIO почему-то
источник

PG

Pïg Grëënëst in ErlangRus
Alex Bubnov
я ее перепутал с unsafePerformIO почему-то
Стрелка перевернулась
источник

AB

Alex Bubnov in ErlangRus
лол, пошли старые добрые мемы
источник

АН

Авроамэриканец Начрэл in ErlangRus
Если функция возвращающая ответ сайта (давайте уже её как-нибудь обозначим, например getContent), возвращает значение типа IO которое содержит в себе контент сайта, то это недетерменированая функция.

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

NV

Nikita Vilunov in ErlangRus
Никто, хаскель невозможен и не работает
источник

AB

Alex Bubnov in ErlangRus
Авроамэриканец Начрэл
Если функция возвращающая ответ сайта (давайте уже её как-нибудь обозначим, например getContent), возвращает значение типа IO которое содержит в себе контент сайта, то это недетерменированая функция.

Если это значение типа IO содержит только инструкции для интерпритатора, то функция может быть детерменированной, но мне не понятно, как тогда выглядит взаимодействие дальше. Ну сгенерировали мы код, который при выполнении вернёт ответ сайта. Кто его обрабатывать будет?
смотри, есть интерпретатор в рантайме.
ему на вход попадает значение типа IO (), которое возвращается функцией main программы, и интерпретатор начинает его интерпретировать. это значение - фактически ast, интерпретатор будет копать идти по нему вглубь, выполняя свои инструкции, которые IO Something и применяя к выполненным результатам обычные чистые функции.
отдельным узлом в котором будет IO String, который вернула твоя функция getContent. в тот момент, когда это значение из инструкции нужно будет превратить в реальное значение, произойдет реальный запрос к сайту, появится настоящее значение, которое дальше как-то обработается.
источник