Size: a a a

2021 March 18

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Хочу. Вот читаю текст у Карпова

We must note the crucial difference between throw e :: a and throwIO e :: IO a, which is exactly the difference between evaluation and execution: evaluation triggers exception in the case of throw e, while execution (when the magical state “goes through” throwIO) triggers exception in the case of throwIO e.

Что значит "evaluation triggers exception in the case of throw e"? У меня есть чистая функция, в которой я видимо должен использовать throw. Я так понимаю evaluation это сведение выражения к слабой головной и если в процессе сведения встретится throw, то все выражение подменится на "a", который выдал throw, но программа не упадет, а если каким либо боком при сведении ветка с throw не будет использована, то исключение проглотится. Так? И узнать я про то, что было исключение могут только в IO. Если этот throw где-то в глубине был, то какими механизмами это "a" протянется через весь стек, это внутренняя реализация?
если каким либо боком при сведении ветка с throw не будет использована, то исключение проглотится

нет, исключение не будет рождено, следовательно, и проглочено не будет
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Хочу. Вот читаю текст у Карпова

We must note the crucial difference between throw e :: a and throwIO e :: IO a, which is exactly the difference between evaluation and execution: evaluation triggers exception in the case of throw e, while execution (when the magical state “goes through” throwIO) triggers exception in the case of throwIO e.

Что значит "evaluation triggers exception in the case of throw e"? У меня есть чистая функция, в которой я видимо должен использовать throw. Я так понимаю evaluation это сведение выражения к слабой головной и если в процессе сведения встретится throw, то все выражение подменится на "a", который выдал throw, но программа не упадет, а если каким либо боком при сведении ветка с throw не будет использована, то исключение проглотится. Так? И узнать я про то, что было исключение могут только в IO. Если этот throw где-то в глубине был, то какими механизмами это "a" протянется через весь стек, это внутренняя реализация?
Если этот throw где-то в глубине был, то какими механизмами это "a" протянется через весь стек, это внутренняя реализация?

в Хаскеле (по умолчанию) нет стэка вызовов, но да, как оно работает — это внутренние детали реализации. наружу торчит только интерфейс: бросить и поймать
источник

JS

Jerzy Syrowiecki in Haskell Start
разницу между evaluation и execution проще всего понять на примере

p = print 1
main = do p; p


печатает единичку дважды. почему?

здесь при вычислении p не происходит печать, а только вычисление действия по печати единички.

зато при исполнении main происходит исполнение дважды того действия, что было единожды вычислено в p
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
разницу между evaluation и execution проще всего понять на примере

p = print 1
main = do p; p


печатает единичку дважды. почему?

здесь при вычислении p не происходит печать, а только вычисление действия по печати единички.

зато при исполнении main происходит исполнение дважды того действия, что было единожды вычислено в p
Меня смущает фраза "здесь при вычислении p не происходит печать, а только вычисление действия по печати единички". Имеется ввиду "при вычислении p компилятор собирает в некий ящик некое всего лишь описание того, что надо сделать при исполнении", а в main этот список просто щелкается и уже ставится на конкретное выполнение?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Меня смущает фраза "здесь при вычислении p не происходит печать, а только вычисление действия по печати единички". Имеется ввиду "при вычислении p компилятор собирает в некий ящик некое всего лишь описание того, что надо сделать при исполнении", а в main этот список просто щелкается и уже ставится на конкретное выполнение?
да, всё так
источник

JS

Jerzy Syrowiecki in Haskell Start
только, наверно, не описание, а собственно исполнимый код
источник

JS

Jerzy Syrowiecki in Haskell Start
а ящик (box) действительно присутствует
источник

JS

Jerzy Syrowiecki in Haskell Start
и исполняется он не в main, а снаружи — main вычисляет программу, а ОС исполняет её
источник

D

Dreamerinnoise in Haskell Start
пролистал на ускоренном, работы с исключениями не нашёл
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
только, наверно, не описание, а собственно исполнимый код
Не понял. Если в P есть if, то он так и попадет в исходную программу которую будет выполнять ОС или же при вычислении P идет кодогенерация (ну или составляется цепочка действий)?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Не понял. Если в P есть if, то он так и попадет в исходную программу которую будет выполнять ОС или же при вычислении P идет кодогенерация (ну или составляется цепочка действий)?
кажется, это своершенно неважно.

но вообще так и попадёт. потому что все вычисления происходят не во время компиляции, а во время исполнения программы
источник

JS

Jerzy Syrowiecki in Haskell Start
Dreamerinnoise
пролистал на ускоренном, работы с исключениями не нашёл
нет, там не про исключения, а про evaluation/execution
источник

D

Dreamerinnoise in Haskell Start
Andrei Yangabishev
А вообще у репетиторства есть какая-то расписанная программа, цель? Я бы не отказался про исключения послушать. А так 2 месяца убил на stepik.
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Не понял. Если в P есть if, то он так и попадет в исходную программу которую будет выполнять ОС или же при вычислении P идет кодогенерация (ну или составляется цепочка действий)?
в нечистых языках evaluation = execution. а также application = call и так далее. у нас чистый язык, и в процессе исполнения (execution) программы иногда происходит evaluation
источник

JS

Jerzy Syrowiecki in Haskell Start
(а ещё есть лазейка, чтобы из evaluation делать execution, но она вне закона)
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
в нечистых языках evaluation = execution. а также application = call и так далее. у нас чистый язык, и в процессе исполнения (execution) программы иногда происходит evaluation
А почему "иногда"? Разве execution возможен без evaluation?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
А почему "иногда"? Разве execution возможен без evaluation?
если уже всё вычислено, то да
источник

AY

Andrei Yangabishev in Haskell Start
Jerzy Syrowiecki
если уже всё вычислено, то да
Что значит "уже вычислено"? Чем? Все же с main начинается, чтобы получить результат нужно main вычислить, у нас же есть только "p = print 1" и еще ничего не вычислено, так? И возможно только при вычислении main мы столкиваемся с упоминанием p и начинаем его вычислять, а когда второй раз встретим p, то "всё уже вычислено". Или речь про оптимизацию, что еще на этапе компиляции вместо p подсовывается сгенерированный код?
источник

JS

Jerzy Syrowiecki in Haskell Start
Andrei Yangabishev
Что значит "уже вычислено"? Чем? Все же с main начинается, чтобы получить результат нужно main вычислить, у нас же есть только "p = print 1" и еще ничего не вычислено, так? И возможно только при вычислении main мы столкиваемся с упоминанием p и начинаем его вычислять, а когда второй раз встретим p, то "всё уже вычислено". Или речь про оптимизацию, что еще на этапе компиляции вместо p подсовывается сгенерированный код?
ну, например, если программа main = exitSuccess, то вроде ничего вычислять не надо, сразу исполняем
источник

JS

Jerzy Syrowiecki in Haskell Start
но вообще да, почти на каждом шаге надо что-то повычислять
источник