• Почему я больше не использую современный C++
    +1
    Работы в этом направлении ведутся уже заметное количество времени. Например
  • «Ошибки — это значения» в Go и эхо VB
    +1
    Стоит начать с того, что АТД были созданы не только для возврата значений. Я даже думаю, что об этом вообще не думали, эта возможность получилась вполне естественно вытекающим из системы типов образом. В отличие, кстати, от возможности возврата нескольких значений, которую в любом случае надо было явно заложить в язык.

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

    Я, кажется, каким-то отличным от вас образом понимаю значение слова «костыль».
  • «Ошибки — это значения» в Go и эхо VB
    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?
  • Перевод: Один год с Go
    +2
    Что вы понимаете под словом «эффективность»? Вы его употребляете в разных контекстах несколько раз.

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

    Что касается наброса про параллелизм в Haskell, опять же, без определения слова «эффективность» это можно было бы оставить без внимания. Но я просто немного понедоумеваю. Haskell компилируется ровно в тот же самый native-код, что и Go. Треды ОС под планировщиком там ровно такие же. И ровно так же он способен параллельно выполнять код (именно параллельно, до стадии, пока не доделаю, а не пока не попросят освободить ядро). Инструменты для анализа есть. Книга, как делать правильно тоже есть. Где мне этот параллелизм кажется и где отсутствие практических достижений, объясните, пожалуйста?
  • Как я нашел лучший в мире язык программирования. Часть 2
    0
    Про concurrency расскажите Эрлангу.
  • Типы и функции
    0
    Если честно, то трудно назвать поддержку рекурсивных типов простейшим случаем.
  • Типы и функции
    +1
    Справедливости ради, простое типизированное лямбда-исчисление в общем случае не полно по Тьюрингу.
  • Системы оплаты проезда на основе DSRC снаружи и внутри
    0
    К PayPass и PayWave всё идёт. Медленно, но дороги (к примеру, ЗСД) имеют намеренья отказаться от эмитирования БСК, потому что это создаёт множество разных проблем. К сожалению, не всё так просто и с PP/PW (есть лимит на оффлайновые транзакции), и с разработчиками софта, поэтому всё движется с великим скрипом.
  • Банкомат. Некоторые особенности
    0
    Вроде бы банкоматы OKI, которые сейчас активно ставит Альфа, как раз используют. По крайней мере, они этим очень гордятся в новостных сообщениях.
  • Поиск работы Java Middle Developer (наблюдения и впечатления)
    +4
    Нечасто, но бывало. Ну вот сами посудите, особый талант или фантастическая сообразительность какому проценту фирм нужна? И, что самое интересное, их-то и проверяют обычно в тех фирмах, где это меньше всего нужно. А культура разработки дело наживное.
  • Поиск работы Java Middle Developer (наблюдения и впечатления)
    0
    Для этого и существует испытательный срок. Потому что даже тестовое задание толком мало что сможет продемонстрировать. Кроме того, бывает, что берут человека на совершенно новую для компании область, в которой напрочь отсутствует экспертиза у кого-либо. Ну и как тогда оценить за полчаса-час? Только беседа плюс результаты реальной работы.
  • Erlang для самых маленьких. Глава 3: Базовый синтаксис функций
    +5
    1. Не любые функции можно использовать в охранных выражениях. А это очень важный момент имеющий весьма веские причины (которые, впрочем, можно объяснить позже)
    2. «Поэтому важно включать в объявление образец, который подойдет под любое значение» В общем случае это не верное замечание. Defensive programming противоречит идеологии эрланга (fail early / let it fail). Если к нам пришло что-либо неожиданное, лучше сразу прекратить исполнение, чтобы не испортить себе стейт или что-либо еще. Если существует разумное умолчание, то да, можно делать дефолтные клозы, но, скорее всего, это только создаст проблем в будущем.
  • Система предсказания свободной парковки от Audi
    0
    Такой уже много где есть (у Mercedes, Ford и т.д.). Уже не удивляет. Разработки Audi и Volvo позволяют выйти из машины и пойти по делам, а машина будет искать парковочное место и парковаться с совершенно пустым салоном. А потом еще и выехать с парковки и подъехать к тому месту, где вы стоите.
  • Задания для разработчика Яндекс.Музыки для iOS
    +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
    
  • Вышел Rust 0.9
    +3
    Go как язык гораздо более примитивный, чем Rust. Если проводить параллели, Go это как статически типизированный компилируемый Python. А в Rust явно питались идеями из C++ и Haskell.
  • Melange — DSL для сетевых протоколов
    0
    Начнем с того, что ASN.1 стандартизирован. Уже это делает его в определенных ситуациях единственным возможным выбором (а не просто является одним из преимуществ, в противовес вашим мечтам). Во-вторых, ASN.1 является великолепным способом описания интерфейса (именно интерфейса, а не какой-то там «общей структуры»; можно очень хорошо и четко конкретизировать и ограничить возможные значения). В некоторой степени, его сложность и количество возможностей, конечно, плохо повлияли на его распространенность (да просто всем западло кодить Unaligned PER энкодер-декодер для всего этого; а тем более генератор парсеров, как, в общем-то, и подобает нормальному инструменту). Поэтому и появились инструменты, вроде Thrift и ProtoBuffers: бывает, что весь имеющийся арсенал — это дичайший оверкилл. Но в тех областях, где он используется (в первую очередь, конечно, телефония и прочие телекомы, где уровень чуть или сильно ниже перегонки личных сообщений по хттп), он используется и замены ему нет. Собственно, единственный минус ASN.1: это малая распространенность.
  • Преимущества C++ как первого языка для обучения программированию
    0
    Я спорил исключительно с утверждением «в рамках строго типизированного языка не решается». Все (если быть точнее, почти все необходимое на практике) решается, если есть нормальная система типов.
  • Преимущества C++ как первого языка для обучения программированию
    0
    Нормально решается. Сделайте тип данных с соответствующими конструкторами и пакуйте в список, что заблагорассудится. Не знаю, как это описать в SML, но на Haskell это будет выглядеть примерно так
    data MyType = Int n | String s
    
    myFilter :: [MyType] -> [MyType]
    ...
    
  • С 2015 года все машины в РФ обязаны быть с ГЛОНАСС'ом
    +2
    Это можно ввести уже сейчас заменив транспортный налог на новый акциз в стоимости топлива. Это будет и логичнее: чем меньше машина жрет, тем меньше платишь. То есть убиваются сразу 2 зайца.
  • С 2015 года все машины в РФ обязаны быть с ГЛОНАСС'ом
    +3
    Вот мне интересно, что будут делать с уже существующими системами.

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

    Что теперь, Volvo должны выкинуть свою нормальную систему и поставить неизвестно что?
  • Erlang для самых маленьких. Глава 2: Модули и функции
    0
    Да, у них там смутное время сейчас. Есть противоречивые сведения, но не мне рассказывать о положении вещей у них. Лучше поинтересоваться непосредственно у инсайдеров. dmitriid например.
  • Erlang для самых маленьких. Глава 2: Модули и функции
    +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 я не припомню, чтобы это пригождалось. Всегда находится способ (матч в голове клоза, вынести логику в лямбду или отдельную функцию) не прибегать к этому. Получается элегантнее.
  • Erlang для самых маленьких. Глава 2: Модули и функции
    +1
    Пишем процессинг платежных транзакций (и кучу вспомогательных вещей). Но мы не одни такие. Шведская Klarna пока еще тоже на эрланге сидит. Кроме того (из того, что еще не отметили), эрланг применяют в hft (Exante), в чем-то связаном с рекламой (насколько я понимаю, Campanja), играми (MochiMedia), интерактивным Web (Echo), видеостриммингом (Flussonic, бывший erlyvideo, код, например, тут можно посмотреть).
  • Erlang для самых маленьких. Глава 1: Типы данных, переменные, списки и кортежи
    +1
    Почему нельзя сопоставлять уже связанные переменные?
    Вполне же рабочий код
    1> A = 5.
    5
    2> {A, _} = {5, whatever}.
    {5, whatever}
    


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

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