@haskellru

Страница 1059 из 1551
Aleksey
05.04.2018
07:02:47
Malbolge
Он не худший. Он просто сложный с точки зрения написания кода - для того и создавался :)

Dmitry
05.04.2018
07:14:25
А какой худший императивный язык?
А что такое "императивный язык"?

Hot
05.04.2018
07:15:13
А что такое "императивный язык"?
Упрощённо - это язык, в котором ты описываешь, что нужно делать для достижения результата.

Но это моё понимание.

Google
Hot
05.04.2018
07:15:23
Могу ошибаться.

Dmitry
05.04.2018
07:16:08
Ну тогда да, Haskell лучший императивный язык

У меня в нём лучше всего получается писать, что надо для достижения результата

Hot
05.04.2018
07:18:56
А разве ты не описываешь в нём только сам результат?

Я всегда думал, что в этом и есть идея декларативных ЯП.

Dmitry
05.04.2018
07:20:04
main = putStrLn "Я -- результат?"

Тут ^ где результат?

Hot
05.04.2018
07:21:56
Монада в этой дискусси - читерство.

Я так и Language.Basic притащу и буду на бейсике внутри хачкеля кодить, чё.

И обвинять хачкель в недостатках бейсика.

Dmitry
05.04.2018
07:23:43
Ну ок, давайте найдём разницу: int fac(int x) { if (x == 0) return 1; else x * fac(x - 1); } и fac 0 = 1 fac n = n * fac $ n - 1 Где описываю "сам результат", а где — не описываю?

Hot
05.04.2018
07:24:46
Хм....

Dmitry
05.04.2018
07:24:51
Или чистые функции в C (по аналогии с монадами в Haskell) — читерство?

Google
Hot
05.04.2018
07:24:52
Ладно, признаю поражение.

Объясните тогда нубу, в чём декларативность хаскеля?

Даниил
05.04.2018
07:25:25
Ну ок, давайте найдём разницу: int fac(int x) { if (x == 0) return 1; else x * fac(x - 1); } и fac 0 = 1 fac n = n * fac $ n - 1 Где описываю "сам результат", а где — не описываю?
во втором случае ты просто описываешь маппинг между аргументом и значением в первом — последовательное вычисление по шагам

Даниил
05.04.2018
07:27:04
В монадах
в чём сила, брат

Hot
05.04.2018
07:29:54
В монадах
В том, что код с побочными эффектами и явной последовательностью выполнения вынесен отдельно от остального ЯП что ли?

IC
05.04.2018
07:31:15
В том, что конструирование кода отделено от его исполнения.

[IO ()]

Hot
05.04.2018
07:32:19
Ты шо, монаду в монаду завернул?

Это вообще законно?

IC
05.04.2018
07:32:37
В функтор.

Hot
05.04.2018
07:32:47
Список - функтор?

Херовые походу мне книжки попались.

Dmitry
05.04.2018
07:33:08
Да можно, просто так микросхемы памяти быстрее деградируют. Надо аккуратно.

Hot
05.04.2018
07:33:08
Там писали, что список, Maybe и IO - монады.

Andrew
05.04.2018
07:33:24
Maybe тоже функтор

и монада

Dmitry
05.04.2018
07:33:33
И IO :(

Даниил
05.04.2018
07:33:35
Там писали, что список, Maybe и IO - монады.
список, Maybe и IO — не монады и не функторы

IC
05.04.2018
07:33:57
Список - функтор?
Некоторые типы - функторы. Из них некоторые - апликативы. Из них некоторые - монады.

Google
Andrew
05.04.2018
07:34:09
список, Maybe и IO — не монады и не функторы
)) они являются экземплярами класса Functor и Monad

Даниил
05.04.2018
07:34:43
монады не имеют никакого отношения к I/O в хаскеле

Andrew
05.04.2018
07:34:43
ну и соотв. они и фкторы и монады)

ойвсе

IC
05.04.2018
07:35:28
Даниил
05.04.2018
07:35:59
Объясните тогда нубу, в чём декларативность хаскеля?
в том что ты всегда описываешь всего лишь соответствее аргументов значениям, не более в хаскеле ты никогда не описываешь последовательные шаги вычислений

IC
05.04.2018
07:36:24
* не всегда

Даниил
05.04.2018
07:36:45
* не всегда
например?

Dmitry
05.04.2018
07:36:48
А цепочки применения функций — это не "последовательные шаги" вычисления результата?

f . g . h ?

IC
05.04.2018
07:37:33
например?
f >=> g >=> h

Dmitry
05.04.2018
07:38:10
А есть синтаксис, чтобы не слева или справа брать результат, а сверху, например?

h | v x >=> ВЖУХ <=< y

IC
05.04.2018
07:39:11
Есть

Zool
05.04.2018
07:40:44
Сейчас кто-нибудь просветится и пойдет писать правильный туториал по монадам

Dmitry
05.04.2018
07:41:04
нет
Разверните мысль

Oleg
05.04.2018
07:41:30
)) они являются экземплярами класса Functor и Monad
самая странная поправка, что я слышал в этом чате

Google
Даниил
05.04.2018
07:41:42
ты понятия не имеешь что произойдёт когда ты применишь f . g . h $ x может x не используется внутри и тогда он не будет вычислен может функция мемоизируется и тогда будет вычислена лишь один раз может ещё что-то ты не думаешь в действительности о том как по шагам будет выполняться твоя логика, ты просто описываешь маппинги из одних значений в другие и комбинируешь их, всё

IC
05.04.2018
07:42:23
h | v x >=> ВЖУХ <=< y
http://hackage.haskell.org/package/needle-0.1.0.1/docs/Control-Arrow-Needle.html

Даниил
05.04.2018
07:43:47
самая странная поправка, что я слышал в этом чате
ну я топлю за то что эта поправка правильная, особенно когда объясняешь что-то новичкам вроде статья была, типа monads considered harmful или вроде того суть в том что когда ты начинаешь говорить типа «чтобы делать I/O в хаскеле нужна монада IO», «чтобы работать с состоянием нужна монада State» и т.д., у абсолютно каждого новичка складывается ощущение что монады — это такой магический способ обойти чистоту хаскеля

поэтому фраза типа «декларативность хаскеля в монадах, потому что они позволяют отделить I/O код от чистого» в корне неверна — к монадам это не имеет никакого отношения, монады лишь для того чтобы такие вычисления удобнее было композить

Hot
05.04.2018
07:48:17
Ок, спасибо, гляну.

Даниил
05.04.2018
07:49:19
Andrew
05.04.2018
07:49:19
звучит, как будто хотел придраться, но точно не знал как
нет я не хотел придраться, это же так и есть. Это значит что Maybe и остальные являются монадами и функторами. Разве не так?

Даниил
05.04.2018
07:49:44
https://en.wikibooks.org/wiki/Haskell/Understanding_monads ещё
конкретно про IO там хорошо расписано и даёт понимание что никакой «монадической магии для обхода чистоты» в хаскельном IO нет

Andrew
05.04.2018
07:50:00
Да, и апликативами

IC
05.04.2018
07:50:22
В монадах магии нет потому что она в апликативах :3

Даниил
05.04.2018
07:51:49
f . g . h ?
ещё чуть добавлю f _ = 42 g x = x + 1 h x = x * x в каком порядке будет вычислено f . g . h $ 666?

Dmitry
05.04.2018
07:52:59
Ну я мог бы и для C++ подобное написать, там благодаря компилятору и инлайнингу тоже всё запутается

Andrew
05.04.2018
07:53:15
(f (g (h 666))) в таком

Dmitry
05.04.2018
07:53:32
Вообще, что значит "порядок вычислений" ?

Google
Даниил
05.04.2018
07:53:45
(f (g (h 666))) в таком
да нет, оно должно средуцироваться до 42 ещё во время компиляции зачем вычислять g(h(666)) если оно не используется?

Andrew
05.04.2018
07:54:00
да, так

я не понял к чему вопрос только))

Даниил
05.04.2018
07:55:14
в каком порядке произойдёт 1 событие? в любом
ну не придирайся, там человек сказал типа когда мы композим функции мы определяем порядок их вычисления

не должно, но может
ну вот по сути я к тому и веду, что мы не думаем в категориях «сначала будет применена первая функция, потом вторая, потом третья»

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

Oleg
05.04.2018
07:56:19
нет я не хотел придраться, это же так и есть. Это значит что Maybe и остальные являются монадами и функторами. Разве не так?
вот есть куча каких-то штук, допустим типов есть класс этих штук, если штука относится к классу, мы иногда, если там захочется сломать язык, можем сказать, что эта штука - экземпляр этого класса чем тогда отличаются выражения "эта штука - монада" и "эта штука принадлежит классу монад"? Т.е. в общем, я согласен, что можно с большими оговорками говорить "IO - не монада, для IO есть экземпляр монады". Заметьте это отличается от поправки "IO - экземпляр монады" Здесь мы рассматриваем "экземпляр монады" как зависимую пару - тип и структура к нему, или "словарь тайпкласса" Но в большом количесте книжек по теортипам упоминается, что если вот эта дополнительная структура, т.е. "словарь тайпкласса" снабжена irrelevance, т.е. доказательством эквивалентности двух разных структур для одного объекта, что нам даёт когерентность тайплкссов, мы вполне можем говорить о "подтипах" или "подкласса" ,в этом случае Monad - это подтип "* -> *"

Yuriy
05.04.2018
07:56:38
как IO может не быть монадой? чушь какая-то. мы же говорим «числа являются группой по сложению»

Oleg
05.04.2018
07:59:25
В таком случае мы вполне можем утверждать, что IO является монадой, в том случае, если построима доп-структура, требуемая определением монады для неё

Поэтому я совершенно не понимаю, как можно сказать сначала "IO - не монада", а потом дополнить это "IO - экземпляр Monad"

Dmitry
05.04.2018
08:03:02
ну не придирайся, там человек сказал типа когда мы композим функции мы определяем порядок их вычисления
В императивных языках тоже порядок вычислений перепутывается компилятором для большей эффективности

И та тоже можно было бы ожидать "42" на этапе компиляции

Ну, если те функции переписать на имп.языке

Denis
05.04.2018
08:04:12
Ооооо, даже в этом чате монадные войны идут...

Даниил
05.04.2018
08:04:36
Поэтому я совершенно не понимаю, как можно сказать сначала "IO - не монада", а потом дополнить это "IO - экземпляр Monad"
ну окей, я утрировал конечно, просто хотел сказать что когда пытаешься объяснить что-то человеку малознакомому с хаскелем и всей этой вашей функциональщиной, нужно строго отделять свойства той же IO от того что она является монадой (реализует Monad, как угодно)

Zool
05.04.2018
08:04:39
Кстати godbolt.org поддерживает haskell. Там можно посмотреть результат компиляции

Denis
05.04.2018
08:05:12
> "IO - не монада, IO - экземпляр Monad" Поправка уровня "IO - не монада, IO - конструктор типа..."

?

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