Vladislav
а do-нотация - просто dsl для более удобного конструирования императивных программ
Ilya
IO Monad Considered Harmful · in Code
https://blog.jle.im/entry/io-monad-considered-harmful.html
Ilya
Вопросы все же остаются
Ilya
Как определено (>>=) для IO? Или для MonadIO?
Vladislav
а никак не определено, это встроенная конструкция
Vladislav
и ее нельзя определить, т.к. нельзя заглянуть внутрь IO a
Vladislav
хотя, если подумать, можно представить имплементацию, в которой IO a - в прямом смысле программа на каком-то конкретном языке
Vladislav
тогда можно будет определить (»=) в явном виде
Ilya
Окей. Пусть так. Вся программа - хитро скомпозированное IO(), которое прогоняется
Ilya
Не, ну а как в байт-код то оно компилируется) это и есть "программа на конкретном языке"
Vladislav
тогда вся императивщина становится просто библиотекой-комбинатором программ на этом языке
Vladislav
компилируется, но implicitly
Vladislav
для кода на хаскелл IO a непрозрачна
Ilya
В статье есть отступление
Vladislav
а могла бы быть data IO a = Code String
Vladislav
я еще не дочитал
Ilya
Что, мол, монадический интерфейс IO вовсе не must
Vladislav
верно
Vladislav
просто он удобен
Ilya
Никак не могу обернуть свой мозг вокруг этого
Vladislav
но необязателен
Ilya
А как было бы без >>= и >>
Ilya
Как композировать-то тогда?
Vladislav
достаточно (»=) и return, » через них определяется
Vladislav
они бы понадобились в каком-то виде
Vladislav
но можно, например, назвать их ioListF :: a -> IO b -> IO a -> IO b и ioLift :: a -> IO a
Vladislav
и не реализовывать Monad IO a
Vladislav
и ввод-вывод бы никуда не делся
Ilya
ioLiftF наверно
Vladislav
да
Ilya
Ммм а не потеряли бы мы прелести трансформеров тогда?
Vladislav
да, в удобстве бы потеряли
Vladislav
в этом и смысл монад - с ними можно работать, абсрагируять от того что там внутри
Vladislav
но выразить все можно и без них, просто больше boilerplate-кода будет
Алдар
IO монада волшебная
Vladislav
я тут подумал что нельзя IO просто как текст программы определить
Vladislav
потому что тогда мы не сможем гарантировать типобезопасность для нее
Алдар
Денис Москвин условно объяснил что эта монада для того чтобы получить информацию из мира должна взять мир, и вернуть пару новый мир и полученное значение
Алдар
IO монада
Ilya
Ммм
Ilya
А я думал, это мир берет IO
Ilya
Main, точнее
Алдар
функция Main наоборот осуществляет ввод вывод и возвращает unit ()
Ilya
Мы тут как раз обсуждали же
Ilya
Что мэйн ниче не дедает
Alexander
Чо за наркомания тут происходит?!
Алдар
как ничего не делает, main имеет тип IO ()
Ilya
Ну и что
Алдар
это значит что она может осуществлять ввод вывод и возвращает ()
Ilya
Ну стой
Ilya
Вот есть putStrLn "foo"
Ilya
Оно ж ниче не делает
Alexander
Байнд для IO не встроен, не надо тут врать
Alexander
Заходите в сырцы base и смотрите определение
Alexander
Так же как и заглянуть в IO можно, но в большинстве случаев не нужно и вредно, т.к. надо понимать, что делаешь
Ilya
Не ходите дети за гаражи
Ilya
Доберусь до сырц - загляну
Ilya
А что там?
Vladislav
http://stackoverflow.com/questions/9244538/what-are-the-definitions-for-and-return-for-the-io-monad
Алдар
как понять ничего не делает? putStrLn имеет тип String -> IO ()
Vladislav
ну ок, bind не встроен, встроен unIO
Алдар
это значит что она берёт строку и может вывести её в вывод
Ilya
Ну то есть в хаскелле есть функция с сайд эфффектом?
Alexander
unIO тоже не встроен
Ilya
Шок!
Alexander
Ну или под встроен какоето странное определение
Алдар
если есть IO значит может быть эффект
Ilya
PutStrLn возвращает объект IO string
Alexander
У меня встроено = то что в компиляторе и требует спец поддержки и не выражается в обычных либах
Ilya
И все
Алдар
putStrLn :: String -> IO ()
Ilya
Да
Ilya
Не суть
Alexander
A value of type IO a is a computation which, when performed, does some I/O before returning a value of type a.
Алдар
берёт String и вовращает unit упакованный в IO
Алдар
и вообще в монадических вычислениях может быть какой либо эффект, к примеру монада списка размножает элементы как эффект
Ilya
И где тут работа с вводом выводом?
Алдар
IO () означает может быть ввод вывод
Ilya
Я не настоящий сварщик, но по-моему ты оперируешь несуществующими понятиями