Size: a a a

2019 December 30

NV

Nikita Vilunov in ErlangRus
только это не ast
источник

AB

Alex Bubnov in ErlangRus
Nikita Vilunov
только это не ast
я понимаю, но аналогия показалась приемлемой
источник

AB

Alex Bubnov in ErlangRus
по сути, форс thunk-а и вправду отдаленно напоминает выполнение лиспового ast. санки io как специальные формы, а остальное - ну тоже похоже.
источник

АН

Авроамэриканец Начрэл in ErlangRus
Alex Bubnov
смотри, есть интерпретатор в рантайме.
ему на вход попадает значение типа IO (), которое возвращается функцией main программы, и интерпретатор начинает его интерпретировать. это значение - фактически ast, интерпретатор будет копать идти по нему вглубь, выполняя свои инструкции, которые IO Something и применяя к выполненным результатам обычные чистые функции.
отдельным узлом в котором будет IO String, который вернула твоя функция getContent. в тот момент, когда это значение из инструкции нужно будет превратить в реальное значение, произойдет реальный запрос к сайту, появится настоящее значение, которое дальше как-то обработается.
Допустим вот код абстрактной программы:
print(getContent('https://www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain'))

Представим что мы уже описали определения функций, print должна вывести в консоль то, что вернёт getContent.

Это корректный пример для хаскеля, или может быть нарушает какие-то паттерны и нужно что-то изменить, что бы всё стало кошерно?
источник

AB

Alex Bubnov in ErlangRus
Авроамэриканец Начрэл
Допустим вот код абстрактной программы:
print(getContent('https://www.random.org/integers/?num=1&min=1&max=10&col=1&base=10&format=plain'))

Представим что мы уже описали определения функций, print должна вывести в консоль то, что вернёт getContent.

Это корректный пример для хаскеля, или может быть нарушает какие-то паттерны и нужно что-то изменить, что бы всё стало кошерно?
не совсем корректный в рамках стандартной библиотеки, типы не сойдутся.
getContent :: String -> IO String
print :: String -> IO ()

для имеющегося stdlib нужно будет написать, кажется
main = getContent(...) >>= print
источник

AB

Alex Bubnov in ErlangRus
но можно написать свою print :: IO String -> IO ()
источник
2019 December 31

YZ

Yuri Zhloba in ErlangRus
Льва допечь, это надо было постараться.
источник

АН

Авроамэриканец Начрэл in ErlangRus
Alex Bubnov
не совсем корректный в рамках стандартной библиотеки, типы не сойдутся.
getContent :: String -> IO String
print :: String -> IO ()

для имеющегося stdlib нужно будет написать, кажется
main = getContent(...) >>= print
Хорошо. Давай разберём выполнение по операциям. Что произойдёт?

- getContent сгенерирует значение типа IO String, которое будет содержать операции обращения к сайту, получения и возвращения контента. Фактически запрос выполнен не будет? Будет возвращено задание?
- Оператор >>=, как я понимаю, выполняет это задание, производит запрос и возвращает строку
- print принимает строку и выводит её в консоль

Всё сработает в точности так?
источник

IS

Ilya Shcherbak in ErlangRus
выбросить чувака?
источник

YZ

Yuri Zhloba in ErlangRus
Ilya Shcherbak
выбросить чувака?
Еще не всех допек, у некоторых осталось желание отвечать
источник

IS

Ilya Shcherbak in ErlangRus
Yuri Zhloba
Еще не всех допек, у некоторых осталось желание отвечать
хамит-с
источник

AB

Alex Bubnov in ErlangRus
Авроамэриканец Начрэл
Хорошо. Давай разберём выполнение по операциям. Что произойдёт?

- getContent сгенерирует значение типа IO String, которое будет содержать операции обращения к сайту, получения и возвращения контента. Фактически запрос выполнен не будет? Будет возвращено задание?
- Оператор >>=, как я понимаю, выполняет это задание, производит запрос и возвращает строку
- print принимает строку и выводит её в консоль

Всё сработает в точности так?
1 - да, так
2 - нет, это более хитрая штука про типы. сейчас не принципиально.
3 - важно не что принимает, а что возвращает. а возвращает print IO (), такой же тикет интерпретатора, как и getContent.
источник

АН

Авроамэриканец Начрэл in ErlangRus
Alex Bubnov
1 - да, так
2 - нет, это более хитрая штука про типы. сейчас не принципиально.
3 - важно не что принимает, а что возвращает. а возвращает print IO (), такой же тикет интерпретатора, как и getContent.
Важно для кого? Для меня важно понять последовательность действий.
Исправь, где я ошибся. Какая последовательность действий на самом деле?
источник

YZ

Yuri Zhloba in ErlangRus
Ilya Shcherbak
хамит-с
Я в молодости тож бывал агресивным, и считал, что меня кто-то обязан учить. С возрастом это проходит)
источник

PG

Pïg Grëënëst in ErlangRus
Авроамэриканец Начрэл
Хорошо. Давай разберём выполнение по операциям. Что произойдёт?

- getContent сгенерирует значение типа IO String, которое будет содержать операции обращения к сайту, получения и возвращения контента. Фактически запрос выполнен не будет? Будет возвращено задание?
- Оператор >>=, как я понимаю, выполняет это задание, производит запрос и возвращает строку
- print принимает строку и выводит её в консоль

Всё сработает в точности так?
>>= делает из двух заданий одно
источник

АН

Авроамэриканец Начрэл in ErlangRus
Pïg Grëënëst
>>= делает из двух заданий одно
Ну print же принимает String, а не задание
источник

PG

Pïg Grëënëst in ErlangRus
Поймал меня
источник

IS

Ilya Shcherbak in ErlangRus
предлагаю заканчивать с хаскелем или идти в профильный чат
источник

PG

Pïg Grëënëst in ErlangRus
(>>=) :: IO a -> (a -> IO b) -> IO b
источник

PG

Pïg Grëënëst in ErlangRus
Дальше должен сам понять
источник