Aliester
че?
Ю ли я? 🤔
Хаскель ещё и лучший императивный язык так-то!
Oleg
Хорошее ООП - отсутствующее ООП
kosc
А какой худший императивный язык?
Anonymous
Ответ все , принимается?)
Alexander
nyan-nyan
Alexander
потому, что вы о нём не слышали
Alexander
и даже я не слышал, и возможно его не существует
Aleksei (astynax)
Malbolge
Он не худший. Он просто сложный с точки зрения написания кода - для того и создавался :)
Dmitry
А какой худший императивный язык?
А что такое "императивный язык"?
kosc
А что такое "императивный язык"?
Упрощённо - это язык, в котором ты описываешь, что нужно делать для достижения результата.
kosc
Но это моё понимание.
kosc
Могу ошибаться.
Dmitry
Ну тогда да, Haskell лучший императивный язык
Dmitry
У меня в нём лучше всего получается писать, что надо для достижения результата
kosc
А разве ты не описываешь в нём только сам результат?
kosc
Я всегда думал, что в этом и есть идея декларативных ЯП.
Dmitry
main = putStrLn "Я -- результат?"
Dmitry
Тут ^ где результат?
kosc
Монада в этой дискусси - читерство.
kosc
Я так и Language.Basic притащу и буду на бейсике внутри хачкеля кодить, чё.
kosc
И обвинять хачкель в недостатках бейсика.
Dmitry
Ну ок, давайте найдём разницу: int fac(int x) { if (x == 0) return 1; else x * fac(x - 1); } и fac 0 = 1 fac n = n * fac $ n - 1 Где описываю "сам результат", а где — не описываю?
kosc
Хм....
Dmitry
Или чистые функции в C (по аналогии с монадами в Haskell) — читерство?
kosc
Ладно, признаю поражение.
kosc
Объясните тогда нубу, в чём декларативность хаскеля?
доня.
Ну ок, давайте найдём разницу: int fac(int x) { if (x == 0) return 1; else x * fac(x - 1); } и fac 0 = 1 fac n = n * fac $ n - 1 Где описываю "сам результат", а где — не описываю?
во втором случае ты просто описываешь маппинг между аргументом и значением в первом — последовательное вычисление по шагам
доня.
В монадах
в чём сила, брат
kosc
В монадах
В том, что код с побочными эффектами и явной последовательностью выполнения вынесен отдельно от остального ЯП что ли?
IC
В том, что конструирование кода отделено от его исполнения.
IC
[IO ()]
kosc
Ты шо, монаду в монаду завернул?
kosc
Это вообще законно?
IC
В функтор.
kosc
Список - функтор?
kosc
Херовые походу мне книжки попались.
Dmitry
Да можно, просто так микросхемы памяти быстрее деградируют. Надо аккуратно.
kosc
Там писали, что список, Maybe и IO - монады.
Andrew
Maybe тоже функтор
Andrew
и монада
Dmitry
И IO :(
доня.
Там писали, что список, Maybe и IO - монады.
список, Maybe и IO — не монады и не функторы
IC
Список - функтор?
Некоторые типы - функторы. Из них некоторые - апликативы. Из них некоторые - монады.
Andrew
список, Maybe и IO — не монады и не функторы
)) они являются экземплярами класса Functor и Monad
доня.
монады не имеют никакого отношения к I/O в хаскеле
Andrew
ну и соотв. они и фкторы и монады)
Andrew
ойвсе
IC
монады не имеют никакого отношения к I/O в хаскеле
Имеют отношение "реализуют"
доня.
Объясните тогда нубу, в чём декларативность хаскеля?
в том что ты всегда описываешь всего лишь соответствее аргументов значениям, не более в хаскеле ты никогда не описываешь последовательные шаги вычислений
IC
* не всегда
доня.
* не всегда
например?
Dmitry
А цепочки применения функций — это не "последовательные шаги" вычисления результата?
Dmitry
f . g . h ?
IC
например?
f >=> g >=> h
Dmitry
А есть синтаксис, чтобы не слева или справа брать результат, а сверху, например?
Dmitry
h | v x >=> ВЖУХ <=< y
IC
Есть
zool
Сейчас кто-нибудь просветится и пойдет писать правильный туториал по монадам
Dmitry
нет
Разверните мысль
Oleg
)) они являются экземплярами класса Functor и Monad
самая странная поправка, что я слышал в этом чате
доня.
ты понятия не имеешь что произойдёт когда ты применишь f . g . h $ x может x не используется внутри и тогда он не будет вычислен может функция мемоизируется и тогда будет вычислена лишь один раз может ещё что-то ты не думаешь в действительности о том как по шагам будет выполняться твоя логика, ты просто описываешь маппинги из одних значений в другие и комбинируешь их, всё
IC
h | v x >=> ВЖУХ <=< y
http://hackage.haskell.org/package/needle-0.1.0.1/docs/Control-Arrow-Needle.html
доня.
самая странная поправка, что я слышал в этом чате
ну я топлю за то что эта поправка правильная, особенно когда объясняешь что-то новичкам вроде статья была, типа monads considered harmful или вроде того суть в том что когда ты начинаешь говорить типа «чтобы делать I/O в хаскеле нужна монада IO», «чтобы работать с состоянием нужна монада State» и т.д., у абсолютно каждого новичка складывается ощущение что монады — это такой магический способ обойти чистоту хаскеля
доня.
поэтому фраза типа «декларативность хаскеля в монадах, потому что они позволяют отделить I/O код от чистого» в корне неверна — к монадам это не имеет никакого отношения, монады лишь для того чтобы такие вычисления удобнее было композить
Oleg
звучит, как будто хотел придраться, но точно не знал как
kosc
Ок, спасибо, гляну.
Andrew
звучит, как будто хотел придраться, но точно не знал как
нет я не хотел придраться, это же так и есть. Это значит что Maybe и остальные являются монадами и функторами. Разве не так?
доня.
https://en.wikibooks.org/wiki/Haskell/Understanding_monads ещё
конкретно про IO там хорошо расписано и даёт понимание что никакой «монадической магии для обхода чистоты» в хаскельном IO нет