Подтвердить что ты не робот

Как долго вам комфортно с Haskell?

Я программист OK C/С++. Я нахожу Хаскелла очень интригующим. Но мне кажется, что, хотя относительно легко написать чистый код Haskell, так как он очень хорошо имитирует математику (что мне очень удобно), очень сложно писать чистый код в Haskell, который работает быстро.

Более быстрая версия quicksort Haskell очень длинная и страшная, которая не имеет ничего общего с наивными, но короткими (две строки), чистой и интуитивно понятной. Длительная и страшная версия Haskell на самом деле все еще намного медленнее, чем более короткая и простая часть счетчика C.

Это потому, что текущий компилятор Haskell слишком тупой или просто невозможно для смертных (кроме SJP, конечно) написать быстрый код Haskell?

4b9b3361

Ответ 1

Вы задаете два разных вопроса: обучение и производительность.

  • Мне понадобилось около месяца, чтобы устроиться с функциональным программированием, используя рекурсию, сопоставление образцов, map, filter и fold. Я сделал все это с ML, но он очень легко перевел на Haskell.
  • Мне потребовалось два или три года, чтобы обмануть голову монадами, но это потому, что я читал неправильные вещи. Я думаю, что сейчас есть лучшие уроки. Но если вы начинаете, избегайте монады на некоторое время.
  • Мне потребовалось несколько месяцев, чтобы создать новые классы классов, но использовать существующие были легко.
  • Я все еще не уверен, что у меня есть оценка ленивой оценки. Но я люблю Haskell чистоту и склонен рассматривать ленивую оценку как несчастную случайность, которую знают лишь немногие люди (например, Джон Хьюз).

Вы заметили проблему с производительностью только потому, что вы адаптировали алгоритм, загруженный мутацией, которую Тони Хоар разработал для императивных языков и попытался перевести на Haskell. В Haskell, как и в любом другом функциональном языке , дорогостоящей операцией является выделение. Попробуйте написать сортировку слияния, и вы найдете ее простой и очень хорошо выполняете.

Как вы избегаете подобных ошибок в будущем? Взгляните на книгу Криса Окасаки Чисто функциональные структуры данных. Отличная книга, и это поможет вам научиться "функциональному способу делать вещи", не отказываясь от производительности.

Ответ 2

Существует очень специфическая причина, по которой quicksort не так быстр в Haskell. Это богоподобный пример алгоритма, который обладает блестящим хакером, вплетенным в то, как он работает. В этом случае я имею в виду, что хакеры - это те методы, которые истинный преданный Хаскелла считал бы неоправданно опасным и не математическим. Первоначальная реализация сделала все возможное, чтобы нарушить правила, которые Haskell налагает на себя: настоящая quicksort работает, перезаписывая слоты для хранения с новой информацией. Это очень больно делать в Haskell, которому гораздо проще создавать целые новые копии существующей информации.

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

Спекуляция: может ли компилятор Haskell анализировать ваш код, применяя те же аргументы, что и Hoare (изобретатель quicksort), и выясните, что он может оптимизировать его, полностью переделав его с учётом состояния? Возможно.

Ответ 3

Дело не в том, чтобы быстро написать код Haskell, а для быстрого написания кода Haskell. Когда вы доберетесь туда, и вам нужно быстро сделать свой код (er), начните оптимизацию (или используйте FFI, вам не нужно забывать свои навыки на С++). В Haskell вы в первую очередь ищете элегантность, надежность и удобство обслуживания. Я бы добавил профилирование к моему Haskell-fu, поэтому вы не тратите время на оптимизацию того, что не используется. И помните, что преждевременно не оптимизируйте.

Ответ 4

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

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

Ответ 5

Причина в том, что математическая основа компьютеров отличается от математической основы Haskell и функциональных языков в целом.

Чтобы получить представление о проблемах, с которыми сталкивается компилятор... Перевести программу Haskell на C, сохраняя ее как можно ближе к оригиналу, а затем попытайтесь оптимизировать этот код C (не переписывая его с нуля на C-way)

Это не глупо, но функциональные языки не созданы для производительности, а сжатые математически простые обозначения не предоставляются бесплатно.