Проголосовал-таки за «Parallel and Concurrent Programming in Haskell» чисто чтобы посмотреть, как на этот раз поиздеваются над терминологией, ибо там ее много. В целом считаю, что техническая литература годится только в оригинале.
В Facebook используется Хаскель для анализа больших массивов данных. Успешные компании, использующие ФП, есть даже в России, посмотрите на Селектел — у них тут на Хабре блог есть.
Нелепый аргумент из серии «если ты такой умный, чего ж ты такой бедный?» — между успехом компании и используемыми инструментами корелляция есть, но это далеко не единственный фактор.
Go никак не может быть убийцей C++. Вот Rust и D — да, определенно, однако стабильности им обоим не хватает. И если для Rust еще простительно, релиза еще не было, то у D с этим совсем плохо. Еще в Rust радует, что бэкенд по умолчанию — LLVM.
Пункты меню с предлогов не начинать, говорите? Дизайнеры ВК смотрят на вас с недоумением. Я с недоумением смотрю на дизайнеров ВК, но что поделать? Досадно, когда такие крупные сайты страдают от таких примитивных ошибок.
Kinds имеют такое же отношение к types, как types к values. То есть можно считать их типами типов, если это не слишком запутывает.
Разговор про kinds, и все на самом деле достаточно просто. Int и Double имеют kind *, что означает, что они являются типами данных сами по себе. А вот просто списка быть не может — может быть список из Int, список из Double, или список из списков из Double, и т. д., то есть он параметризуется другим типом, поэтому его kind — это * -> *. А вот функция (->) тоже не может быть сама по себе, она из некого типа в другой, поэтому она параметризуется двумя типами, так что ее kind — это * -> * -> *.
Интереснее то, что kind есть не только у типов, но и, например, классов типов. Функтор, например, параметризуется неким типов, kind которого * -> *, и мы получаем некий тип данных, но не совсем любой — про него известно, как минимум, что для него определна операция fmap, что в некотором смысле является ограничением (constraint), так что
Да, что никаким образом не является аргументом, так как реальные последовательности команд процессору — задача оптимизирующего комиплятора (за исключением низкоуровенвых программ, вроде драйверов).
Вы становитесь функциональной элиткой и можете тешить свое ЧСВhabrahabr.ru/post/190492/
Разговор про kinds, и все на самом деле достаточно просто. Int и Double имеют kind *, что означает, что они являются типами данных сами по себе. А вот просто списка быть не может — может быть список из Int, список из Double, или список из списков из Double, и т. д., то есть он параметризуется другим типом, поэтому его kind — это * -> *. А вот функция (->) тоже не может быть сама по себе, она из некого типа в другой, поэтому она параметризуется двумя типами, так что ее kind — это * -> * -> *.
Интереснее то, что kind есть не только у типов, но и, например, классов типов. Функтор, например, параметризуется неким типов, kind которого * -> *, и мы получаем некий тип данных, но не совсем любой — про него известно, как минимум, что для него определна операция fmap, что в некотором смысле является ограничением (constraint), так что
xkcd-стандарты.пнг