
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

IC
05.04.2018
07:26:56

Даниил
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

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

Google

Andrew
05.04.2018
07:34:09

Даниил
05.04.2018
07:34:20

IC
05.04.2018
07:34:21

Даниил
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

Dmitry
05.04.2018
07:38:10
А есть синтаксис, чтобы не слева или справа брать результат, а сверху, например?
h
|
v
x >=> ВЖУХ <=< y

IC
05.04.2018
07:39:11
Есть

Даниил
05.04.2018
07:40:05

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

Dmitry
05.04.2018
07:41:04

Oleg
05.04.2018
07:41:30

Google

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

IC
05.04.2018
07:42:23

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

Oleg
05.04.2018
07:46:17
звучит, как будто хотел придраться, но точно не знал как

Dmitry
05.04.2018
07:47:44

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

Даниил
05.04.2018
07:49:19

Andrew
05.04.2018
07:49:19

Даниил
05.04.2018
07:49:44

IC
05.04.2018
07:49:47

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

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

Dmitry
05.04.2018
07:51:45

Даниил
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
да, так
я не понял к чему вопрос только))

Yuriy
05.04.2018
07:54:32

Даниил
05.04.2018
07:55:14
не должно, но может
ну вот по сути я к тому и веду, что мы не думаем в категориях «сначала будет применена первая функция, потом вторая, потом третья»
мы просто композируем маппинги, как оно там внутри будет вычисляться это работа компилятора


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

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

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