Aλeχ
а хочешь действительно ощутить мощь хаскеля
Aλeχ
реализуй или посмотри как реализованы функциональные абстракции в с++
Aλeχ
и ужаснись)
Andrei
Я хорошо себе представялю как они реализованы. И вопрос опять же не об этом был. Но после пассажей про boost, я твоим словам перестаю доверять, извини.
Евгений
Сравнивать C++ и haskell... Я вернулся в 2013?
Евгений
Пробовал написать бекенд на плюсах?
Andrei
Зря я вообще упомянул про C++, меня не интересует именно сравнение.
Andrei
Пробовал написать бекенд на плюсах?
Не просто пробовал, а написал и даже не один.
Евгений
Угу. Я тогда продолжать разговор не буду, какой имеет смысл дискуссия с людьми, которые придумывают заслуги? Я сотворил этот мир тогда
Andrei
Придумывают?
Andrei
Но это правда. Я С++ программист. Далеко не первый год.
Arseniy
Все яп не оч, давно же договорились
Евгений
Но это правда. Я С++ программист. Далеко не первый год.
Ну если бы ты был C++ программистом, то писал бы библиотеки, десктопный софт, системный софт. Что угодно, только не бекенд
Andrei
Я скорее вот о чём. В Питоне например есть такая приятная фича, которой в других языках нет, множественное присваивание при возврате из функции например a,b = range(2)
Yurii
синтаксический сахар?
Andrei
товарищ не знает что несет (
Видимо да, или он думает, что фейсбук, гугл или яндекс бекенд написан НЕ на С++.
Евгений
куча бекенда для игрушек написано на с++
Для каких ещё игрушек? Ага, nodejs-плюсостек
Quet
Для каких ещё игрушек? Ага, nodejs-плюсостек
для чуть менее чем всех ААА тайтлов например )
Andrei
Бля, я пишу на питоне каждый день, это далеко не киллер-фича питона
Я понимаю, это был пример сахара, который может привлечь новичка.
Dmitrii
Я скорее вот о чём. В Питоне например есть такая приятная фича, которой в других языках нет, множественное присваивание при возврате из функции например a,b = range(2)
В Haskell есть паттерн-мэтчинг. Можно написать эквивалетный аналог. Только вместо абстрактного перечисления переменных через запятую ты явно указываешь структуру, из которой были получены объекты let [a, b] = [1..2]
Aragaer
фейсбук на пхп. У яндекса поиск вроде на плюсах
Andrei
В фейсбуке бекенд написан на php
Ага. Про folly никогда не слышали?
Евгений
Так поиск это и не бекенд нихуя, это системный софт
Aragaer
о, я на самом деле не знаю, что такое бэкенд
Евгений
Чо? Вы вообще понимаете, что такое бекенд?
Quet
ща нам расскажут что это такое
Quet
пацаны, слушаем гуру
Andrei
Так поиск это и не бекенд нихуя, это системный софт
Это вопрос терминологии, но даже если и так, непосредственно код, который генерирует ответ web-клиенту на c++ пишут, и я в том числе писал.
Andrei
Мне нужны еще такие фичи. Паттерн матчинга в плюсах нет. Это очень выразительный инструмент.
Andrei
Что еще?
Andrei
+- есть в плюсах. На шаблонах, некрасиво, но есть.
Евгений
Стек монад
Евгений
Вывод кайндов :3
Andrei
Не то же, но в каком-то виде метапрограммирование есть.
Andrei
Стек монад
Это уже относится к самому языку больше.
Andrei
Это просто то, как пишут на Хаскелле, нежели чем какая-то его оригинальная задумка.
Andrei
List comprehension например, тоже очень приятная и выразительная вещь.
Евгений
Неа, стек монад напрямую связан с call-by-need
Andrei
Я понимаю, но я говорю сейчас про то, что применимо к языкам с eager evalutaion.
Евгений
Собственно call-by-need это киллер-фича, ни в одном другом продакшн языке его нет
Dmitrii
Что еще?
Вещь, которая идёт рука об руку с паттерн-мэтчингом -- алгебраические типы данных. Или же tagged union. В С++ есть обычный union, который для других целей. Но это очень полезная вещь в языке. Она очень хорошо помогает структурировать программу, потому что ты буквально средствами языка делаешь декомпозицию -- разбиваешь на на случаи и обрабатываешь каждый случай параллельно. Что-нибудь базовое: data Either a b = Left a | Right b После программирования на Haskell очень трудно привыкать к менее удобным вариантам, когда функция может вернуть либо одно либо другое. Что-то менее тривиального из недавного: Size тип данных в библиотеке сериализации store data Size a = ConstSize Int | VarSize (a -> Int) Размер объекта может быть либо константным (для оптимизаций полезно) либо переменным. Дополнительным бонусом идёт то, что компилятор проверяет все паттерны на exhaustiveness. То есть на этапе компиляции можно быть уверенным, что реально все случаи обработаны. Это очень удобно, когда код рефакторится и добавляются новые случаи (правда, к сожалению, код можно написать так, что пользы от этой фичи именно в таком случае с рефакторингом не будет :( )
Andrei
Собственно call-by-need это киллер-фича, ни в одном другом продакшн языке его нет
Хорошо, я это запишу, но мы понимаем, что это можно делать и на классических языках с оверхедом не мильно больше Хаскеллевского.
Andrei
Вещь, которая идёт рука об руку с паттерн-мэтчингом -- алгебраические типы данных. Или же tagged union. В С++ есть обычный union, который для других целей. Но это очень полезная вещь в языке. Она очень хорошо помогает структурировать программу, потому что ты буквально средствами языка делаешь декомпозицию -- разбиваешь на на случаи и обрабатываешь каждый случай параллельно. Что-нибудь базовое: data Either a b = Left a | Right b После программирования на Haskell очень трудно привыкать к менее удобным вариантам, когда функция может вернуть либо одно либо другое. Что-то менее тривиального из недавного: Size тип данных в библиотеке сериализации store data Size a = ConstSize Int | VarSize (a -> Int) Размер объекта может быть либо константным (для оптимизаций полезно) либо переменным. Дополнительным бонусом идёт то, что компилятор проверяет все паттерны на exhaustiveness. То есть на этапе компиляции можно быть уверенным, что реально все случаи обработаны. Это очень удобно, когда код рефакторится и добавляются новые случаи (правда, к сожалению, код можно написать так, что пользы от этой фичи именно в таком случае с рефакторингом не будет :( )
Да, алгебраическиый типы данных, точно. Спасибо.
Andrei
Вопрос вот какой, правда ли, что на этапе компиляции не всегда известен настоящий тип в сумме, и поэтому это уходит в рантайм?
Евгений
Хорошо, я это запишу, но мы понимаем, что это можно делать и на классических языках с оверхедом не мильно больше Хаскеллевского.
Нельзя вообще никак. У тебя должно быть чистое ядро языка, что call-by-need применить. Надо изолировать эффекты -- либо с помощью монад, либо линейных типов (или их вариаций)
Andrei
Нельзя вообще никак. У тебя должно быть чистое ядро языка, что call-by-need применить. Надо изолировать эффекты -- либо с помощью монад, либо линейных типов (или их вариаций)
Именно это я и имел в виду. И разумеется это можно сделать, если придерживаться определённых правил написания программы.
Евгений
Вопрос вот какой, правда ли, что на этапе компиляции не всегда известен настоящий тип в сумме, и поэтому это уходит в рантайм?
Неправда. Если у тебя вывод типов не может завершится, то компилятор попадёт в инфинити луп
Andrei
Неправда. Если у тебя вывод типов не может завершится, то компилятор попадёт в инфинити луп
Нет, я не об этом. У меня конкретный тип может быть известен в рантайме, только.
Евгений
Именно это я и имел в виду. И разумеется это можно сделать, если придерживаться определённых правил написания программы.
И что ты делать с этим кодом будешь? Если компилятор языка и рантайм не умеет в редукцию графов, но она работать и не будет. Плюс надо подчинить ей все эффекты, что в грязном языке практически невозможно. Да, реально сделать ленивую функцию, но смысл хацкеля именно во всеохватывающем call-by-need
Andrei
Тогда я не понимаю.
Andrei
У меня есть Maybe
Andrei
Я пишу код для обеих веток.
Andrei
Само значение получаю из IO
Andrei
Откуда компилятор заранее знает, какая из веток сработает?
Andrei
Ему надо скомпилировать обе и где-то оставить место для рантайм информации о том, Just у меня или Nothing
Andrei
Я имею в виду, что в том месте, где происходит непосредственное использование суммы типов не всегда достаточно статической информации, чтобы определить конкретный тип.
Andrei
Как Хаскелль с этим справляется?
Aragaer
IO тоже имеет тип
Andrei
О, привет.
Vladislav
привет)
Andrei
Да, я понимаю, что иначе и быть не может, вопрос в том, элиминирует ли Хаскелль эту информацию, если может?
Aragaer
если в результате IO приходят какие-то данные, сразу оговаривается их тип. На этапе компиляции этот тип учитывается
Vladislav
если в результате IO приходят какие-то данные, сразу оговаривается их тип. На этапе компиляции этот тип учитывается
вопрос не про это, вопрос в том, может ли ghc оптимизировать ситуации, когда в compile-time точно известно, какой именно конструктор алгебраического типа используется
Vasiliy
наверняка может
Aragaer
а, в смысле некая библиотека принимает Either Int String, но в нашем коде используется исключительно String и никогда Int