
Vladislav
14.04.2016
22:05:32
но можно, например, назвать их ioListF :: a -> IO b -> IO a -> IO b и ioLift :: a -> IO a
и не реализовывать Monad IO a
и ввод-вывод бы никуда не делся

Ilya
14.04.2016
22:06:17
ioLiftF наверно

Google

Vladislav
14.04.2016
22:06:27
да

Ilya
14.04.2016
22:06:48
Ммм а не потеряли бы мы прелести трансформеров тогда?

Vladislav
14.04.2016
22:07:48
да, в удобстве бы потеряли
в этом и смысл монад - с ними можно работать, абсрагируять от того что там внутри
но выразить все можно и без них, просто больше boilerplate-кода будет

Aldar
14.04.2016
22:30:57
IO монада волшебная

Vladislav
14.04.2016
22:31:48
я тут подумал что нельзя IO просто как текст программы определить
потому что тогда мы не сможем гарантировать типобезопасность для нее

Aldar
14.04.2016
22:33:29
Денис Москвин условно объяснил что эта монада для того чтобы получить информацию из мира должна взять мир, и вернуть пару новый мир и полученное значение
IO монада

Ilya
14.04.2016
22:34:43
Ммм
А я думал, это мир берет IO

Google

Ilya
14.04.2016
22:35:25
Main, точнее

Aldar
14.04.2016
22:37:46
функция Main наоборот осуществляет ввод вывод и возвращает unit ()

Ilya
14.04.2016
22:38:19
Мы тут как раз обсуждали же
Что мэйн ниче не дедает

Alexander
14.04.2016
22:38:50
Чо за наркомания тут происходит?!

Aldar
14.04.2016
22:39:27
как ничего не делает, main имеет тип IO ()

Ilya
14.04.2016
22:39:33
Ну и что

Aldar
14.04.2016
22:39:46
это значит что она может осуществлять ввод вывод и возвращает ()

Ilya
14.04.2016
22:40:54
Ну стой
Вот есть putStrLn "foo"
Оно ж ниче не делает

Alexander
14.04.2016
22:41:34
Байнд для IO не встроен, не надо тут врать
Заходите в сырцы base и смотрите определение
Так же как и заглянуть в IO можно, но в большинстве случаев не нужно и вредно, т.к. надо понимать, что делаешь

Ilya
14.04.2016
22:42:46
Не ходите дети за гаражи
Доберусь до сырц - загляну
А что там?

Vladislav
14.04.2016
22:44:04
http://stackoverflow.com/questions/9244538/what-are-the-definitions-for-and-return-for-the-io-monad

Aldar
14.04.2016
22:44:09
как понять ничего не делает? putStrLn имеет тип String -> IO ()

Vladislav
14.04.2016
22:44:20
ну ок, bind не встроен, встроен unIO

Google

Aldar
14.04.2016
22:44:36
это значит что она берёт строку и может вывести её в вывод

Ilya
14.04.2016
22:45:34
Ну то есть в хаскелле есть функция с сайд эфффектом?

Alexander
14.04.2016
22:45:35
unIO тоже не встроен

Ilya
14.04.2016
22:45:43
Шок!

Alexander
14.04.2016
22:45:50
Ну или под встроен какоето странное определение

Aldar
14.04.2016
22:46:02
если есть IO значит может быть эффект

Ilya
14.04.2016
22:46:09
PutStrLn возвращает объект IO string

Alexander
14.04.2016
22:46:20
У меня встроено = то что в компиляторе и требует спец поддержки и не выражается в обычных либах

Ilya
14.04.2016
22:46:21
И все

Aldar
14.04.2016
22:46:42
putStrLn :: String -> IO ()

Ilya
14.04.2016
22:46:51
Да
Не суть

Alexander
14.04.2016
22:47:01
A value of type IO a is a computation which, when performed, does some I/O before returning a value of type a.

Aldar
14.04.2016
22:47:05
берёт String и вовращает unit упакованный в IO
и вообще в монадических вычислениях может быть какой либо эффект, к примеру монада списка размножает элементы как эффект

Ilya
14.04.2016
22:47:55
И где тут работа с вводом выводом?

Aldar
14.04.2016
22:48:23
IO () означает может быть ввод вывод

Ilya
14.04.2016
22:50:22
Я не настоящий сварщик, но по-моему ты оперируешь несуществующими понятиями

Alexander
14.04.2016
22:50:51
IO вообще тупо тип, говорящий что есть эффект IO. Не больше не меньше.
У него есть свойчтва он функтор, что позволяет поднимать в него чистые функции

Google

Alexander
14.04.2016
22:52:05
Аппликативный функтор, что позволяет последовательно делать независимые действия, или применять чистую функцию к результатам независимых действий

Aldar
14.04.2016
22:52:06
до это тип, но это не означает что в любой функции которая имеет IO реально происходит ввод вывод
просто означает что может быть ввод вывод
как эффект монадического связывания

Vladislav
14.04.2016
22:52:37
ok, в свежем GHC IO определен через ST от RealWorld

Ilya
14.04.2016
22:52:39
?

Alexander
14.04.2016
22:52:53
И monad, который позволяет связать результат одного действия с другим действием
Т.е. monad это удобный API для работы
Есть подход явного тегирования функций эффектами
Но это работает в строгих ЯП только
Есть в каких-то лиспах
Можно как в старые добрые времена сделать что-то похожее на интерпретатор по типу Free

Aldar
14.04.2016
22:54:37
аппликатив это тоже из теории категорий?

Alexander
14.04.2016
22:54:53
Вроде да, я не знаю ТК
Ilya в общем-то вон аж 3 подхода
3.5

Aldar
14.04.2016
22:55:22
я немного прочитал, в общем это такая нехилая математическая теория
абстрактная теория

Alexander
14.04.2016
22:55:47
С applicative вообще интересно их полезность совсем недавно поняли

Aldar
14.04.2016
22:56:08
которую можно использовать много где, начиная от квантовой физики и заканчивая топологией

Google

Aldar
14.04.2016
22:56:16
ну и в хаскелле само собой
там вводится понятие категории, объект, морфизм, функтор, моноид - это всё оттуда
в хаскелле объекты для категорий - типи, морфизмы - функции

Alexander
14.04.2016
22:57:41

Aldar
14.04.2016
22:57:45
функтор и есть функтор

Alexander
14.04.2016
22:58:58
При том что есть специальные вещи которые уже именно встроены типа magicDict и побочных вещей, которые работают только на уровне core или вообще хаки в typechecker

Aldar
14.04.2016
22:59:12
в общем замудрили нехило, но в принципе чтобы прогать на хаскелле не обязательно в это лезть

Alexander
14.04.2016
22:59:29
Да

Vladislav
14.04.2016
23:00:13
интересно, как в других компиляторах сделано

Alexander
14.04.2016
23:00:51
Эм?

Aldar
14.04.2016
23:01:07
как понять хаскель перестаёт быть чистым?)

Alexander
14.04.2016
23:01:10
С чего это вдруг перестает?

Aldar
14.04.2016
23:01:24
хаскель это практически чистое типизированное лямбда исчисление

Alexander
14.04.2016
23:02:29
Вообще всякие unsafePerformIO/unsafeInlineIO /unsafeCoerce# ломают чистоту
Но в общем-то это единственное, что ломает, да используется редко и не собирается с -XSafe если кого-то это сильно беспокоит

Vladislav
14.04.2016
23:03:09

Alexander
14.04.2016
23:03:37
Но они нужны
И ничего с этим не сделаешь
Очень редко, но нужны

Vladislav
14.04.2016
23:04:15
есть кстати примеры, когда без них нельзя? если не считать либу компилятора

Alexander
14.04.2016
23:06:19
Со всякими gadts иногда ума компилятора не хватает на правильный reasoning и приходится его через unsafeCoerce убеждать, крайне редко