@haskellru

Страница 316 из 1551
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
нужно очень хорошо знать boost
Это тоже неправда, но вопрос мой совсем не об этом.

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
Придумывают?

Но это правда. Я С++ программист. Далеко не первый год.

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

Евгений
23.06.2017
18:36:54
Но это правда. Я С++ программист. Далеко не первый год.
Ну если бы ты был C++ программистом, то писал бы библиотеки, десктопный софт, системный софт. Что угодно, только не бекенд

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

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

Quet
23.06.2017
18:37:50
Andrei
23.06.2017
18:38:31
товарищ не знает что несет (
Видимо да, или он думает, что фейсбук, гугл или яндекс бекенд написан НЕ на С++.

Евгений
23.06.2017
18:38:38
куча бекенда для игрушек написано на с++
Для каких ещё игрушек? Ага, nodejs-плюсостек

Quet
23.06.2017
18:38:55
Для каких ещё игрушек? Ага, nodejs-плюсостек
для чуть менее чем всех ААА тайтлов например )

Andrei
23.06.2017
18:38:59
Бля, я пишу на питоне каждый день, это далеко не киллер-фича питона
Я понимаю, это был пример сахара, который может привлечь новичка.

Google
Dmitry
23.06.2017
18:39:06
Я скорее вот о чём. В Питоне например есть такая приятная фича, которой в других языках нет, множественное присваивание при возврате из функции например a,b = range(2)
В Haskell есть паттерн-мэтчинг. Можно написать эквивалетный аналог. Только вместо абстрактного перечисления переменных через запятую ты явно указываешь структуру, из которой были получены объекты let [a, b] = [1..2]

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

Andrei
23.06.2017
18:39:48
В фейсбуке бекенд написан на php
Ага. Про folly никогда не слышали?

Евгений
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
Так поиск это и не бекенд нихуя, это системный софт
Это вопрос терминологии, но даже если и так, непосредственно код, который генерирует ответ web-клиенту на c++ пишут, и я в том числе писал.

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
Собственно call-by-need это киллер-фича, ни в одном другом продакшн языке его нет
Хорошо, я это запишу, но мы понимаем, что это можно делать и на классических языках с оверхедом не мильно больше Хаскеллевского.

Вещь, которая идёт рука об руку с паттерн-мэтчингом -- алгебраические типы данных. Или же 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
Хорошо, я это запишу, но мы понимаем, что это можно делать и на классических языках с оверхедом не мильно больше Хаскеллевского.
Нельзя вообще никак. У тебя должно быть чистое ядро языка, что call-by-need применить. Надо изолировать эффекты -- либо с помощью монад, либо линейных типов (или их вариаций)

Andrei
23.06.2017
18:51:28
Нельзя вообще никак. У тебя должно быть чистое ядро языка, что call-by-need применить. Надо изолировать эффекты -- либо с помощью монад, либо линейных типов (или их вариаций)
Именно это я и имел в виду. И разумеется это можно сделать, если придерживаться определённых правил написания программы.

Евгений
23.06.2017
18:52:16
Вопрос вот какой, правда ли, что на этапе компиляции не всегда известен настоящий тип в сумме, и поэтому это уходит в рантайм?
Неправда. Если у тебя вывод типов не может завершится, то компилятор попадёт в инфинити луп

Andrei
23.06.2017
18:54:43
Неправда. Если у тебя вывод типов не может завершится, то компилятор попадёт в инфинити луп
Нет, я не об этом. У меня конкретный тип может быть известен в рантайме, только.

Евгений
23.06.2017
18:54:48
Именно это я и имел в виду. И разумеется это можно сделать, если придерживаться определённых правил написания программы.
И что ты делать с этим кодом будешь? Если компилятор языка и рантайм не умеет в редукцию графов, но она работать и не будет. Плюс надо подчинить ей все эффекты, что в грязном языке практически невозможно. Да, реально сделать ленивую функцию, но смысл хацкеля именно во всеохватывающем call-by-need

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 тоже имеет тип

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
если в результате IO приходят какие-то данные, сразу оговаривается их тип. На этапе компиляции этот тип учитывается
вопрос не про это, вопрос в том, может ли ghc оптимизировать ситуации, когда в compile-time точно известно, какой именно конструктор алгебраического типа используется

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

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

тогда в компайл тайме при использовании этой библиотеки может быть выброшена ветка для Int. Так?

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

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

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

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