LINUX.ORG.RU

Ответ на: комментарий от mimimimi

Прошло пять лет, наверно есть более успешные истории

Неа, это же Хаскелль).

Virtuos86 ★★★★★
()
Ответ на: комментарий от mimimimi

nope. Есть гораздо более дешёвые способы решения проблем.

Dark_SavanT ★★★★★
()

В Facebook используют Haskell. Лень искать, да и времени нет у меня, но там внедряет сам автор Haskell run-time system-ы. Даже кое-что потом оптимизировали в GHC на основе полученного опыта. Поищи, есть блог.

Есть и другие применения. Из той же вики Haskell можно кое-что почерпнуть. Для проектирования САПР что-то такое есть, например

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)

хаскель и лисп не знаю, но почему все удивляются что эти ЯП мало кто использует, раз у них такая паршивая инфраструктура?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от dave

В Facebook используют Haskell. Лень искать, да и времени нет у меня, но там внедряет сам автор Haskell run-time system-ы. Даже кое-что потом оптимизировали в GHC на основе полученного опыта. Поищи, есть блог.

Спасибом, посмотрю.

Для проектирования САПР что-то такое есть, например

меня больше бэк интересует.

mimimimi
() автор топика
Ответ на: комментарий от I-Love-Microsoft

раз у них такая паршивая инфраструктура?

Курица и яйцо, макаки — вот это все.

mimimimi
() автор топика
Ответ на: комментарий от ymn

Видел записи докладов с ruhaskell-митапов, например?

нет. спасибо посмотрю.

mimimimi
() автор топика
Ответ на: комментарий от I-Love-Microsoft

почему все удивляются что эти ЯП мало кто использует, раз у них такая паршивая инфраструктура?

Вообще-то, в haskell инфраструктура - одна из лучших из тех, что я видел, а видел я многое. Где-то рядом будет rust с его cargo

dave ★★★★★
()
Последнее исправление: dave (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Дело не в инфраструктуре, хаскелю тупо не хватает кодеров. Просто трудяг без тарканов, закидонов и мания величия. Любой нарезатель круда здесь моментально осознает себя богом и начинает нарезать зигохистоморфные препроморфизмы вместо круда. Поэтому хаскель академический язык, воспринимать это надо буквально как язык для академиков, теоретиков CS. А для работы берется что-то более адекватное, даже если нужен суровый матан.

anonymous
()
Ответ на: комментарий от dave

Спорить не буду, но в любой теме Haskell/Lisp где я прошу дать наглядный пример убийственной эффективности гибкости и фантастических возможностей этих языков и их инфраструктуры, всё время какие-то отговорки, описания непревзойденного вкуса трюфелей для тех, кто их никогда не ел.

Иными словами, мне как пользователю Qt/Python, всё еще остается не ясным, за каким профитом стоит изучать омерзительные на первый взгляд языки типа хаскеля и лиспа.

И я люблю приводить пример, что например преимущества SystemVerilog я могу четко и внятно описать, относительно менее эффективных графических способов ввода схем.

I-Love-Microsoft ★★★★★
()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Uber Query Parser, например.

Насчет убийственных возможностей: это лучший в мире язык для STLC ггг. Если серьезно, то не умеющим гуглить ничего не поможет.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

мне как пользователю Qt/Python, всё еще остается не ясным, за каким профитом стоит изучать омерзительные на первый взгляд языки типа хаскеля и лиспа.

Но вот пример от пользователя питона

Перешёл с питона на хаскель. Больше всего доставляют:

1. Паттерн матчинг.

2. Изоляция чистого кода от побочных эффектов и изменения состояния от ввода-вывода. Это, пожалуй, самое принципиальное отличие хаскеля даже от его собратьев по функциональщине.

3. Выведение типов и их зависимостей. А не просто статика а-ля алгол или auto из сишарпа.

4. Заточеность под композицию. Вместе с №3 — чумовая вещь для DSL. Наверно как в Ruby, только наааамного безопасней из-за №2.

5. На самом деле довольно примитивный язык, но практически любые модные фичи подключаются простым импортом. Акторы эрланга, каналы go, макросы лиспа — есть всё. И многое ещё влепят.

6. Динамическая типизация там где надо. Вместе с №1 парсить тот же JSON парктически так же легко, как и в питоне / js.

7. Библиотеки во всю использующие вышеперечисленое написаные настоящими титанами кода. Да и сам GHC это просто Engineering Marvel.

monk ★★★★★
()
Ответ на: комментарий от anonymous

начинает нарезать зигохистоморфные препроморфизмы

Собственно, что плохого в recursion-schemes, кроме зубодробительных названий?

Наверное ты имеешь в виду адские для неподготовленного человека расширения языка? Но ведь никто никого не может заставить писать на haskell98, и стремление запилить type safe API - это хорошо. Только не надо никогда делать только type safe вариант на GADT, проще сделать API без строгой типизации и сверху навернуть параметризованный newtype, например.

anonymous
()
Ответ на: комментарий от monk

Понял только пункты 5 и 7. Где бы найти с примерами подробности по остальным пунктам? С демонстрацией этих принципов?

А то ведь я такой, кукарекаю что не нужно, а потом глядишь и сам на хаскель пересяду...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

Кто такой штангист? Но я тоже так хотю. Я про такое слышал, но там не всё так просто, через некий самописный транслятор кажись, разве нет?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от monk

Перешёл с питона на хаскель.

Сразу чувствуется масштаб задач адепта.

anonymous
()
Ответ на: комментарий от I-Love-Microsoft

Да у него свой HHDL:

eDSL.

Я с их помощью создавал штуки, которые *гарантировано* отвечали за наносекунды, обрабатывая потоки в десятки гигабайт в секунду. FPGA, да.

anonymous
()
Ответ на: комментарий от monk

Еще бы на примере реального кода посмотреть. А то как говорит Линус - говорить просто , покажите ваш код ))

pinachet ★★★★★
()
Ответ на: комментарий от anonymous

то не хацкель же, а erlang и не FPGA, а опердени

Deleted
()
Ответ на: комментарий от eao197

Но он вроде как уже в Yandex-е на Python-е

Классика. Многотрудный путь аленяодепта. Потратить треть жизни на херню и прибиться в итоге на место, где и старшеклассник потащит.

anonymous
()
Ответ на: комментарий от anonymous

Боишься, что скоро и тебя школьником заменят?

Не боюсь. Ты еще не знаешь, но сложность работы определяется решаемыми задачами, а не используемым языком программирования.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

Ну, ты знаешь, кому-то и питон кажется омерзительным, как и Qt. На цвет и вкус товарищей нет

dave ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Понял только пункты 5 и 7. Где бы найти с примерами подробности по остальным пунктам? С демонстрацией этих принципов?

1. Возможность вместо кучи if/case писать что-то вроде

processDirective context@(Context {multiline = Just (sym, val), vars = vars}) line = ...
processDirective context ('@':newFile) = ...
processDirective context line = ...

На питоне это будет выглядеть примерно как

def processDirective(context, line):
  if isJust(context.multline):
    sym = context.multiline.sym
    val = context.multiline.val
    vars = context.vars
    ...
  elif line[0] = '@':
    newFile = line[1:]
    ...
  else:
    ... 

2. В типе функции указано, чистая она или нет. Если функция чистая, то она гарантированно зависит только от своих аргументов. Намного проще тестировать (не надо готовить состояние).

3. Можно написать что-то вроде f x y = x (y + 1) и автоматически получить, что f в качестве первого параметра ожидает функцию с одним аргументом, который является числом (реализует интерфейс Num) и тип результата f будет типом результата этой функции. В Haskell это записывается как:

f :: Num t1 => (t1 -> t) -> t1 -> t

4. Там, где в питоне что-то врое

def process(context, templateFile, outFile):
  with open(templateFile) as f:
    with open(outFile, "w") as fOut:
      for line in f:
        context = processLine(processTemplate, context, line)
      fOut.write(reverse(context.result).join("\n))
В Haskell
process context templateFile outFile =
    readFile templateFile
        >>= foldM (processLine processTemplate) context . lines
        >>= writeFile outFile . unlines . reverse . result
Причём вся цепочка автоматически проверяется на корректность. Если я в питоне вместо fOut.write(reverse(context.result).join(«\n)) напишу fOut.write(reverse(context).join(»\n)), то про ошибку узнаю при запуске, а в Haskell если пропущу в конце ". result", то при компиляции он укажет, что такой комбинации функций быть не может (reverse ожидает список, а не структуру Context).

monk ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

6. Для парсинга JSON достаточно описать тип с нужными полями. deriving (..., Typeable) автоматически создаёт decodeJSON и encodeJSON

{-# LANGUAGE DeriveDataTypeable #-}
import           Text.JSON.Generic

data Address = Address
    { house  :: Integer
    , street :: String
    , city   :: String
    , state  :: String
    , zip    :: Integer
    } deriving (Show, Data, Typeable)

data Person = Person
    { name    :: String
    , age     :: Integer
    , address :: Address
    } deriving (Show, Data, Typeable)

aa :: String
aa = "{\"name\": \"some body\", \"age\" : 23, \"address\" : {\"house\" : 285, \"street\" : \"7th Ave.\", \"city\" : \"New York\", \"state\" : \"New York\", \"zip\" : 10001}}"

main = print (decodeJSON aa :: Person)
Обрати внимание на строку (decodeJSON aa :: Person). В Haskell можно выбирать нужный метод не только по типам аргументов, но и по типу возвращаемого результата.

monk ★★★★★
()

Одна из лучших систем компьютерной алгебры - Wolfram Mathematica - на самом деле Лисп, только причёсанный и с сахаром. Это самый большой вин лиспа, имхо. Хоть где-то он победил, кроме скриптоты.

А вот с хаскелем сложнее. Но какие-то вакансии по нему в Сингапуре закрывали, кардано вон делают, в банках кто-то что-то писал (но блджад, где ссылки?). Очень мало на нём всё-таки пишут, по сравнению со всякими плюсами, жавой и пхп. То есть пишут, и единичные вакансии по всему миру появляются. Но тухленько, если смотреть со стороны менеджмента.

А на счёт экосистемы - не слушай фанбоев, крутой пакетный менеджер (стэк) и даже свежевпиливаемый бакпак (который, впрочем, в стэк ещё даже не впилили) - это ещё не всё. Это уже дофига, но совсем далеко не всё. В качестве своеобразного идеологического теста Тьюринга предлагаю самостоятельно подумать «чего же там может не хватать».

anonymous
()
Ответ на: комментарий от RazrFalcon

Это не только в хаскеле есть.

Это есть в почти любом динамически типизированном языке (питон, лисп, ...). А вот в статически типизированных (pascal, C, C++, ...) не всегда

monk ★★★★★
()
Ответ на: комментарий от anonymous

Одна из лучших систем инженерной математики - MathWorks MATLAB - на самом деле Java, и что с того?

anonymous
()
Ответ на: комментарий от monk

2. В типе функции указано, чистая она или нет.

Мне казалось, что раз это есть даже в фортране, то есть практически везде. Похоже, что мало в каких языках для отслеживания этого есть встроенные инструменты.

grem ★★★★★
()
Ответ на: комментарий от anonymous

MathWorks MATLAB - на самом деле Java, и что с того?

Вроде там только гуйня на ней.

mimimimi
() автор топика
Ответ на: комментарий от grem

Мне казалось, что раз это есть даже в фортране, то есть практически везде.

Даже в фортране это появилось только в 95 году. В GNU C тоже есть __attribute__ ((pure)) и __attribute__ ((const)).

Но пользоваться ими крайне неудобно (и в фортране и в си), так как многие функции, которые на самом деле чистые, не помечены соответствующим атрибутом, а значит их невозможно использовать из функций, помеченных атрибутом pure или const.

monk ★★★★★
()
Ответ на: комментарий от anonymous

Одной рукой коменты пишешь, другой борщ ешь?

Aswed ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.