
Alex
23.06.2017
18:20:14
я сахар и все прочие вещи как раз из него в стандарт и идут

Andrei
23.06.2017
18:20:28
Когда я говорю про знание С++ я имею в виду не только синтаксис и стандартную бибилиотеку.

Alex
23.06.2017
18:20:51
ну я конечно не сахар)
но ты понял

Google

Andrei
23.06.2017
18:21:00

Alex
23.06.2017
18:21:38
смотря какой уровень компании в которой ты работаешь
в любой более менее серьезной boost обязателен
что-то холиварчик развели
хочешь сделать что-то на хаскель на скорую руку можно посмотреть в сторону веба
а хочешь действительно ощутить мощь хаскеля

Matway
23.06.2017
18:24:30

Alex
23.06.2017
18:24:34
реализуй или посмотри как реализованы функциональные абстракции в с++
и ужаснись)

Andrei
23.06.2017
18:26:11
Я хорошо себе представялю как они реализованы. И вопрос опять же не об этом был. Но после пассажей про boost, я твоим словам перестаю доверять, извини.

Евгений
23.06.2017
18:31:58
Сравнивать C++ и haskell... Я вернулся в 2013?
Пробовал написать бекенд на плюсах?

Google

Andrei
23.06.2017
18:33:18
Зря я вообще упомянул про C++, меня не интересует именно сравнение.

Евгений
23.06.2017
18:35:05
Угу. Я тогда продолжать разговор не буду, какой имеет смысл дискуссия с людьми, которые придумывают заслуги?
Я сотворил этот мир тогда

Andrei
23.06.2017
18:35:22
Придумывают?
Но это правда. Я С++ программист. Далеко не первый год.

Quet
23.06.2017
18:35:55

Arseniy
23.06.2017
18:36:06
Все яп не оч, давно же договорились

Евгений
23.06.2017
18:36:54

Andrei
23.06.2017
18:36:58
Я скорее вот о чём. В Питоне например есть такая приятная фича, которой в других языках нет, множественное присваивание при возврате из функции например
a,b = range(2)

Matway
23.06.2017
18:37:28

Yurii
23.06.2017
18:37:32
синтаксический сахар?

Quet
23.06.2017
18:37:33

Andrei
23.06.2017
18:37:37

Quet
23.06.2017
18:37:50

Евгений
23.06.2017
18:38:06

Andrei
23.06.2017
18:38:31

Евгений
23.06.2017
18:38:38

Quet
23.06.2017
18:38:55

Andrei
23.06.2017
18:38:59

Google

Dmitry
23.06.2017
18:39:06

Aragaer
23.06.2017
18:39:29
фейсбук на пхп. У яндекса поиск вроде на плюсах

Andrei
23.06.2017
18:39:48

Евгений
23.06.2017
18:39:54
Так поиск это и не бекенд нихуя, это системный софт

Quet
23.06.2017
18:40:13

Aragaer
23.06.2017
18:40:23
о, я на самом деле не знаю, что такое бэкенд

Евгений
23.06.2017
18:40:30
Чо? Вы вообще понимаете, что такое бекенд?

Quet
23.06.2017
18:40:32
ща нам расскажут что это такое
пацаны, слушаем гуру

Andrei
23.06.2017
18:40:42

Евгений
23.06.2017
18:41:22

Andrei
23.06.2017
18:41:33
Мне нужны еще такие фичи. Паттерн матчинга в плюсах нет. Это очень выразительный инструмент.
Что еще?
+- есть в плюсах. На шаблонах, некрасиво, но есть.

Евгений
23.06.2017
18:42:21
Стек монад
Вывод кайндов :3

Andrei
23.06.2017
18:43:01
Не то же, но в каком-то виде метапрограммирование есть.
Стек монад
Это уже относится к самому языку больше.
Это просто то, как пишут на Хаскелле, нежели чем какая-то его оригинальная задумка.

Google

Andrei
23.06.2017
18:44:01
List comprehension например, тоже очень приятная и выразительная вещь.

Евгений
23.06.2017
18:44:08
Неа, стек монад напрямую связан с call-by-need

Andrei
23.06.2017
18:45:19
Я понимаю, но я говорю сейчас про то, что применимо к языкам с eager evalutaion.

Евгений
23.06.2017
18:45:59
Собственно call-by-need это киллер-фича, ни в одном другом продакшн языке его нет


Dmitry
23.06.2017
18:47:51
Что еще?
Вещь, которая идёт рука об руку с паттерн-мэтчингом -- алгебраические типы данных. Или же tagged union. В С++ есть обычный union, который для других целей. Но это очень полезная вещь в языке. Она очень хорошо помогает структурировать программу, потому что ты буквально средствами языка делаешь декомпозицию -- разбиваешь на на случаи и обрабатываешь каждый случай параллельно.
Что-нибудь базовое: data Either a b = Left a | Right b
После программирования на Haskell очень трудно привыкать к менее удобным вариантам, когда функция может вернуть либо одно либо другое.
Что-то менее тривиального из недавного: Size тип данных в библиотеке сериализации store
data Size a = ConstSize Int | VarSize (a -> Int)
Размер объекта может быть либо константным (для оптимизаций полезно) либо переменным. Дополнительным бонусом идёт то, что компилятор проверяет все паттерны на exhaustiveness. То есть на этапе компиляции можно быть уверенным, что реально все случаи обработаны. Это очень удобно, когда код рефакторится и добавляются новые случаи (правда, к сожалению, код можно написать так, что пользы от этой фичи именно в таком случае с рефакторингом не будет :( )


Andrei
23.06.2017
18:48:08
Вещь, которая идёт рука об руку с паттерн-мэтчингом -- алгебраические типы данных. Или же tagged union. В С++ есть обычный union, который для других целей. Но это очень полезная вещь в языке. Она очень хорошо помогает структурировать программу, потому что ты буквально средствами языка делаешь декомпозицию -- разбиваешь на на случаи и обрабатываешь каждый случай параллельно.
Что-нибудь базовое: data Either a b = Left a | Right b
После программирования на Haskell очень трудно привыкать к менее удобным вариантам, когда функция может вернуть либо одно либо другое.
Что-то менее тривиального из недавного: Size тип данных в библиотеке сериализации store
data Size a = ConstSize Int | VarSize (a -> Int)
Размер объекта может быть либо константным (для оптимизаций полезно) либо переменным. Дополнительным бонусом идёт то, что компилятор проверяет все паттерны на exhaustiveness. То есть на этапе компиляции можно быть уверенным, что реально все случаи обработаны. Это очень удобно, когда код рефакторится и добавляются новые случаи (правда, к сожалению, код можно написать так, что пользы от этой фичи именно в таком случае с рефакторингом не будет :( )
Да, алгебраическиый типы данных, точно. Спасибо.
Вопрос вот какой, правда ли, что на этапе компиляции не всегда известен настоящий тип в сумме, и поэтому это уходит в рантайм?


Евгений
23.06.2017
18:50:18

Дмитрий
23.06.2017
18:51:26

Andrei
23.06.2017
18:51:28

Евгений
23.06.2017
18:52:16

Дмитрий
23.06.2017
18:52:19

Andrei
23.06.2017
18:54:43

Евгений
23.06.2017
18:54:48

Andrei
23.06.2017
18:56:01
Тогда я не понимаю.
У меня есть Maybe
Я пишу код для обеих веток.
Само значение получаю из IO

Google

Andrei
23.06.2017
18:56:53
Откуда компилятор заранее знает, какая из веток сработает?
Ему надо скомпилировать обе и где-то оставить место для рантайм информации о том, Just у меня или Nothing
Я имею в виду, что в том месте, где происходит непосредственное использование суммы типов не всегда достаточно статической информации, чтобы определить конкретный тип.
Как Хаскелль с этим справляется?

Aragaer
23.06.2017
18:59:24
IO тоже имеет тип

Vladislav
23.06.2017
19:00:28

Andrei
23.06.2017
19:00:42
О, привет.

Vladislav
23.06.2017
19:00:50
привет)

Andrei
23.06.2017
19:01:16
Да, я понимаю, что иначе и быть не может, вопрос в том, элиминирует ли Хаскелль эту информацию, если может?

Aragaer
23.06.2017
19:02:23
если в результате IO приходят какие-то данные, сразу оговаривается их тип. На этапе компиляции этот тип учитывается

Vladislav
23.06.2017
19:04:10

Vasiliy
23.06.2017
19:04:28
наверняка может

Aragaer
23.06.2017
19:05:24
а, в смысле некая библиотека принимает Either Int String, но в нашем коде используется исключительно String и никогда Int
тогда в компайл тайме при использовании этой библиотеки может быть выброшена ветка для Int. Так?

Vladislav
23.06.2017
19:06:36

Aragaer
23.06.2017
19:07:02
я думаю, что можно это контролировать флагами оптимизации

Дмитрий
23.06.2017
19:07:52
В хаскеле за годы развития набралось уже наверное безумное количество оптимизаций с самыми хитровывернутыми следствиями из теории типов)

Aragaer
23.06.2017
19:09:09
скажем так. Я обычно для себя все перевожу на С. Или в данном случае на плюсы. Есть библиотека с перегруженной функцией, которая может принимать инт или стринг. Или может темплейт - и две функции. Суть та же. Если я линкуюсь с этой либой статически, линкер подхватит только одну из двух версий. Если динамически - останутся обе, но используется только одна.