Leeb
+1
Работы в этом направлении ведутся уже заметное количество времени. Например
Leeb
+1
Стоит начать с того, что АТД были созданы не только для возврата значений. Я даже думаю, что об этом вообще не думали, эта возможность получилась вполне естественно вытекающим из системы типов образом. В отличие, кстати, от возможности возврата нескольких значений, которую в любом случае надо было явно заложить в язык.

Более того, АТД легко и просто позволяют кодировать 2 взаимоисключающих значения (именно поэтому они disjoint), то, что нужно, когда нам нужно вернуть значение или причину, по которой его вычисление не удалось. Вы же предлагаете всегда возвращать N значений, которые, чаще всего, взаимоисключающие, помечая отсутствие специальным значением. Согласитесь, что отсутствие значения (когда мы возвращаем одно значение, другого у нас просто нет, оно не null, не nil; оно отсутствует и взять его не откуда) и специальное значение, которое по договорённости означает отсутствие этого самого значения — вещи несколько различающиеся (не говоря уже о том, что второе вообще звучит, как бред).

Я, кажется, каким-то отличным от вас образом понимаю значение слова «костыль».
Leeb
0
По-моему, lair под union type имел в виду не то, что вы подумали, а тип-сумму (в том смысле, в котором это понимает теория типов), или алгебраический тип данных. На Haskell это будет выглядеть примерно так
data Maybe a = Just a | Nothing

parseInt :: String -> Maybe Int
parseInt s = ...


Эта запись как раз и значит, что значение этого типа — это или одно (Just a), или другое (Nothing, ничего). Option[A] в Scala работает ровно так же. И никаких toString и прочей ерунды. Если нас интересует не просто отсутствие значения, а какая-то индикация в случае, когда значения нет (ошибка), существует тип Either, который можно параметризовать типами успешного и неуспешного результата (хотя в данном случае они абсолютно равнозначны, есть просто соглашение).

Большое преимущество такого подхода в том, что за правильностью обращения с этими типами следит тайпчекер, а не какой-то линтер, предупреждения которого, в общем-то, можно и проигнорировать. Он же и следит за тем, что мы рассмотрим в конечном итоге все варианты, которые могла вернуть функция (и Just, и Nothing). Никакой динамической типизации это и не снилось.

Заметьте, функция не начинает возвращать несколько значений (если вам так хочется, вы, конечно, можете воспользоваться типом-произведением, иначе кортежем, но технически это будет всё равно одно значение). Не надо изобретать велосипед, эти вещи вполне себе известны давным давно и успешно применяются. Другое дело, что это всё тянет за собой параметрический полиморфизм, сопоставление с образцом, часто нормальную композицию функций, и вообще размышления о компонуемости примитивов в языке. Конечно, проще вернуть два значения (а если захочется 3? какое из них будет ошибкой?), и объявить всё остальное не нужным.

И раз уж вы так уверены, что возврат ошибки превращает чистую функцию в нечистую, расскажите мне, нужна ли коммутация с внешним миром парсеру? Ведь для одного и того же входа с синтаксический ошибкой он будет возвращать всегда одну и ту же ошибку, а для одного и того же верного входа — всегда одно и то же AST?
Leeb
+2
Что вы понимаете под словом «эффективность»? Вы его употребляете в разных контекстах несколько раз.

Параллелизм и конкурентность, действительно, вещи не эквивалентные. Erlang, например, про конкуретность (но, вроде как, Go с ним соперничает в этом). И тут же можно сразу поговорить о том, как работает планировщик в Erlang и в Go. У первого он обеспечивает действительно настоящюю вытесняющую многозадачность, чётко отводя процессам лимит времени (если быть совсем точно, то лимит инструкций) и переключая процессы по достижению этого лимита или раньше (но не позже!). Это обеспечивает невероятную плавность планирования (в купе с механизмами work stealing и настраиваемыми стратегиями распределения работы по планировщикам). Да, ценой некоторой потери в производительности (всё-таки виртуальная машина), но ведь тут речь про регулирование конкуретного доступа к ресурсам, а не числодробление. Я когда год назад искал информацию по тому, как именно работает планировщик в Go, не нашёл ничего, кроме упоминания, что переключение осуществляется на вызовах в runtime. Понятно, что на компилируемом в native-код языке трудно сделать честную вытесняющую многозадачность лёгких потоков, но это так же ставит вопрос, где всё-таки concurrency сделана эффективнее.

Что касается наброса про параллелизм в Haskell, опять же, без определения слова «эффективность» это можно было бы оставить без внимания. Но я просто немного понедоумеваю. Haskell компилируется ровно в тот же самый native-код, что и Go. Треды ОС под планировщиком там ровно такие же. И ровно так же он способен параллельно выполнять код (именно параллельно, до стадии, пока не доделаю, а не пока не попросят освободить ядро). Инструменты для анализа есть. Книга, как делать правильно тоже есть. Где мне этот параллелизм кажется и где отсутствие практических достижений, объясните, пожалуйста?
Leeb
0
Про concurrency расскажите Эрлангу.
Leeb
0
Если честно, то трудно назвать поддержку рекурсивных типов простейшим случаем.
Leeb
+1
Справедливости ради, простое типизированное лямбда-исчисление в общем случае не полно по Тьюрингу.
Leeb
0
К PayPass и PayWave всё идёт. Медленно, но дороги (к примеру, ЗСД) имеют намеренья отказаться от эмитирования БСК, потому что это создаёт множество разных проблем. К сожалению, не всё так просто и с PP/PW (есть лимит на оффлайновые транзакции), и с разработчиками софта, поэтому всё движется с великим скрипом.
Leeb
0
Вроде бы банкоматы OKI, которые сейчас активно ставит Альфа, как раз используют. По крайней мере, они этим очень гордятся в новостных сообщениях.
Leeb
+4
Нечасто, но бывало. Ну вот сами посудите, особый талант или фантастическая сообразительность какому проценту фирм нужна? И, что самое интересное, их-то и проверяют обычно в тех фирмах, где это меньше всего нужно. А культура разработки дело наживное.
Leeb
0
Для этого и существует испытательный срок. Потому что даже тестовое задание толком мало что сможет продемонстрировать. Кроме того, бывает, что берут человека на совершенно новую для компании область, в которой напрочь отсутствует экспертиза у кого-либо. Ну и как тогда оценить за полчаса-час? Только беседа плюс результаты реальной работы.
Leeb
+5
1. Не любые функции можно использовать в охранных выражениях. А это очень важный момент имеющий весьма веские причины (которые, впрочем, можно объяснить позже)
2. «Поэтому важно включать в объявление образец, который подойдет под любое значение» В общем случае это не верное замечание. Defensive programming противоречит идеологии эрланга (fail early / let it fail). Если к нам пришло что-либо неожиданное, лучше сразу прекратить исполнение, чтобы не испортить себе стейт или что-либо еще. Если существует разумное умолчание, то да, можно делать дефолтные клозы, но, скорее всего, это только создаст проблем в будущем.
Leeb
0
Такой уже много где есть (у Mercedes, Ford и т.д.). Уже не удивляет. Разработки Audi и Volvo позволяют выйти из машины и пойти по делам, а машина будет искать парковочное место и парковаться с совершенно пустым салоном. А потом еще и выехать с парковки и подъехать к тому месту, где вы стоите.
Leeb
+1
Скорее уж так, хотя в деталях мог ошибиться
SELECT t.name, COUNT(d.track_id) as c
FROM track_downloads d
INNER JOIN tracks t on t.id = d.track_id
GROUP BY d.track_id
HAVING c > 1000
Leeb
+3
Go как язык гораздо более примитивный, чем Rust. Если проводить параллели, Go это как статически типизированный компилируемый Python. А в Rust явно питались идеями из C++ и Haskell.
Leeb
0
Начнем с того, что ASN.1 стандартизирован. Уже это делает его в определенных ситуациях единственным возможным выбором (а не просто является одним из преимуществ, в противовес вашим мечтам). Во-вторых, ASN.1 является великолепным способом описания интерфейса (именно интерфейса, а не какой-то там «общей структуры»; можно очень хорошо и четко конкретизировать и ограничить возможные значения). В некоторой степени, его сложность и количество возможностей, конечно, плохо повлияли на его распространенность (да просто всем западло кодить Unaligned PER энкодер-декодер для всего этого; а тем более генератор парсеров, как, в общем-то, и подобает нормальному инструменту). Поэтому и появились инструменты, вроде Thrift и ProtoBuffers: бывает, что весь имеющийся арсенал — это дичайший оверкилл. Но в тех областях, где он используется (в первую очередь, конечно, телефония и прочие телекомы, где уровень чуть или сильно ниже перегонки личных сообщений по хттп), он используется и замены ему нет. Собственно, единственный минус ASN.1: это малая распространенность.
Leeb
0
Я спорил исключительно с утверждением «в рамках строго типизированного языка не решается». Все (если быть точнее, почти все необходимое на практике) решается, если есть нормальная система типов.
Leeb
0
Нормально решается. Сделайте тип данных с соответствующими конструкторами и пакуйте в список, что заблагорассудится. Не знаю, как это описать в SML, но на Haskell это будет выглядеть примерно так
data MyType = Int n | String s

myFilter :: [MyType] -> [MyType]
...
Leeb
+2
Это можно ввести уже сейчас заменив транспортный налог на новый акциз в стоимости топлива. Это будет и логичнее: чем меньше машина жрет, тем меньше платишь. То есть убиваются сразу 2 зайца.
Leeb
+3
Вот мне интересно, что будут делать с уже существующими системами.

У Volvo уже есть аналогичная система под названием OnCall. Она работает в России полностью, у них есть собственные кол-центры и помимо указанной в законе функциональности она содержит еще большой ряд функций (вплоть до управления некоторыми функциями автомобиля удаленно со смартфона) и имеет одно очень важное преимущество перед тем, что предлагают наши законотворцы: ее делали те же люди, что и автомобиль, и степень интеграции со всеми системами (и в том числе системами безопасности) гораздо выше.

Что теперь, Volvo должны выкинуть свою нормальную систему и поставить неизвестно что?
Leeb
0
Да, у них там смутное время сейчас. Есть противоречивые сведения, но не мне рассказывать о положении вещей у них. Лучше поинтересоваться непосредственно у инсайдеров. dmitriid например.
Leeb
+1
Именно return нет. Но, если требуется прервать выполнение из за ошибки (и при этом не выпустить ошибку наружу), можно слепить конструкцию из catch и begin… end например (но это плохой пример, потому что можно и нужно обойтись и без этого трюка, но идея должна быть ясна).
foo(Bar) ->
    catch begin
        Zoo = do_some_very_necessary_work(),
        if 
          Bar < 5 -> throw({error, invalid_bar});
          true -> ok
        end,
        Result = do_bar(Bar, Zoo),
        {ok, Result}
    end.


А насчет return из середины при happy path я не припомню, чтобы это пригождалось. Всегда находится способ (матч в голове клоза, вынести логику в лямбду или отдельную функцию) не прибегать к этому. Получается элегантнее.
Leeb
+1
Пишем процессинг платежных транзакций (и кучу вспомогательных вещей). Но мы не одни такие. Шведская Klarna пока еще тоже на эрланге сидит. Кроме того (из того, что еще не отметили), эрланг применяют в hft (Exante), в чем-то связаном с рекламой (насколько я понимаю, Campanja), играми (MochiMedia), интерактивным Web (Echo), видеостриммингом (Flussonic, бывший erlyvideo, код, например, тут можно посмотреть).
Leeb
+1
Почему нельзя сопоставлять уже связанные переменные?
Вполне же рабочий код
1> A = 5.
5
2> {A, _} = {5, whatever}.
{5, whatever}


А вот это так вообще бывает очень полезно
> F = fun([H | _], H) -> ok end. 
Leeb
0
Насколько я понимаю (пару месяцев шерстил интернет) проблема не в поддержке со стороны телефонов, а в том, что API для эмуляции не является публичным и для доступа к нему нужен бубен.
Leeb
+1
На самом деле, если без каких-то уточняющих обстоятельств (например, для случая когда мы заранее не знаем, какой набор функций нам необходимо применить к аргументу), код из вашего последнего примера — терминальная стадия идиотизма. Может, случай меня миновал, но я не могу припомнить, чтобы видел такой код без необходимости.

Что же касается простоты и линейности, культура написания кода на Хаскелле заключается в комбинировании (композиции) функций, что можно записать очень компактно и окинуть одним взглядом. Буквально, как предложение прочитать. Безусловно, это требует приобретения некоторого навыка скорочтения, что повышает порог, особенно для имеющих укоренившийся императивный бэкграунд. Но это не требует обязательного применения страшных, неизвестно что делающих операторов, вроде <**>, >>? или .&. (хотя без этого иногда не обойтись), и я не вижу в этой конкретной сложности ничего плохого.
Leeb
+1
На самом деле есть. Но если сделать над собой существенное, но непродолжительное усилие (заставить продраться через несколько заборов, в том числе забор монад; ни за что не поверю, что без их хоть какого-нибудь понимания возможно писать что-нибудь полезное; но при этом ни за что не поверю, что их невозможно понять), то не слишком умно написанные программы по виду действительно чем-то напоминают питон (особенно, если гуй лепить, например :D )
Leeb
+1
А вот поведение машины в этом случае и является наиболее интригующем в их разработке. Посмотрим, как им это удалось решить. Если вообще удалось.
Leeb
0
У Geely есть свой бизнес по постройке четырехколесных повозок. И они лицензировали у Volvo платформу предыдущего S80 вроде бы. Так что лезть именно в дела шведов им не то, чтобы было очень резонно. Купили, пользуются достижениями. И Volvo могут позволить себе отдавать свои не самые свежие Know How, так как теперь очень активно идет техническое обновление всей линейки автомобилей. Вот буквально на днях анонсировали новую линейку двигателей, которая пойдет на все модели. Полностью собственная разработка. Больше никакой ямахи или форда.
Leeb
+1
У Volvo, к примеру, фары не светодиодные, а ксеноновые с механическим шаблоном. Матричные светодиодные фары головного света появятся на рестайлинговой Audi A8, которую официально представят послезавтра. В остальном мало чем. Более того, поскольку Mercedes Benz уже раскрыл свои карты, в их руках теперь преимущество. Обещают на новом XC90 показать польностью автономную парковку (вышел из машины, нажал на кнопку и ушел, а место машина уже сама поехала искать, а не как теперь у всех: включите задний ход, нажимайте педаль газа, теперь драйв и т.д.)
Leeb
+1
Интернет, к примеру, пока дешевле, чем у большой тройки.
Leeb
0
Так есть же навалом. Начиная от ML, заканчивая Coq, Agda и так далее.
Leeb
0
Речь об автомобилях, поэтому имелись в виду обычные для автомобиля 12 вольтовые розетки.
Leeb
+2
Прикуриватель именно как прикуриватель во многих автомобилях уже опция за отдельную плату. Но стандартные розетки никуда не исчезают при этом. У меня в машине их 2 (прикуривателя нет)
Leeb
+5
+ NFC, + карты памяти, + существенно тоньше и почти на треть легче (почти 200 грамм разница в массе)
Leeb
0
Естественно, можно.
Leeb
+1
OCaml у них в качестве бэкэнда. Но, вообще, целый зоопарк. И чуть-чуть C, и Clojure.
Leeb
+3
Если строки хранить в бинарях, а не списках, то скорость вполне на уровне.
Leeb
+1
Выглядит программно это примерно так