@haskellru

Страница 12 из 1551
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 просто как текст программы определить

потому что тогда мы не сможем гарантировать типобезопасность для нее

IO монада волшебная
IO монада или 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
ok, в свежем GHC IO определен через ST от RealWorld
Да вообще там магия и поддержка только для того чтобы сделать код эффективным и вырезать state tokens. А так обычный strict state

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
в общем замудрили нехило, но в принципе чтобы прогать на хаскелле не обязательно в это лезть
со всем этим добром хаскелл перестает быть чистым, лучше бы спрятали все внутрь втроенных IO/ST

интересно, как в других компиляторах сделано

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 если кого-то это сильно беспокоит

Alexander
14.04.2016
23:03:37
Но они нужны

И ничего с этим не сделаешь

Очень редко, но нужны

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

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

Страница 12 из 1551