killbuddha.ru (встретишь Будду - убей Будду)

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Haskell

Сообщений 1 страница 7 из 7

1

Хотел обратиться лично, но, думаю, пока у нас тут затишье на форуме - можно пообщаться и публично.

Итак, троль, несколько (для начала) вопросов по Хаскель (насколько я понимаю, вы работаете с ним довольно активно).

Что в нем хорошо, что плохо по вашему мнению?
Какие приложения вы реализовывали?
Использовали ли когда-нибудь happstack?

2

Так написал(а):

Хотел обратиться лично, но, думаю, пока у нас тут затишье на форуме - можно пообщаться и публично.

Итак, троль, несколько (для начала) вопросов по Хаскель (насколько я понимаю, вы работаете с ним довольно активно).

Что в нем хорошо, что плохо по вашему мнению?
Какие приложения вы реализовывали?
Использовали ли когда-нибудь happstack?

Я активно пишу на агде (Agda), а на хаскеле я кажется ни разу не написал программу, которая была бы больше 200 строк. Так что ни в экосистеме, ни в методах дебага/профилирования я не разбираюсь, хотя сам язык знаю относительно неплохо, как и многие идиомы, поскольку сижу на stackoverflow и читаю релевантные статьи.

Так написал(а):

Что в нем хорошо, что плохо по вашему мнению?

Что хорошо, то и плохо. Чистота (purity) гарантирует (если не пользоваться грязными трюками), что чистая функция, вызванная с одними и теми же аргументами, всегда вернет один и тот же результат (то есть нет глобальных переменных — только глобальные константы, нельзя читать из stdin и т.д.), но если тебе вдруг понадобится в этой функции вывести что-нибудь на экран, то ее всю придется переписывать (для отладочной печати есть модуль Debug.Trace, который позволяет не переписывать функцию, но в нем используются "грязные трюки").
Абсолютно уродская система эффектов (monad transformers), которая превращает написание любой более-менее реальной программы в эквилибристику с типами.
Ленивость (laziness) позволяет писать хорошо структурированные программы (а также делать то, что в обычном языке типа Java сделать вообще нельзя, как например функция в хаскеле может в своем теле использовать то значение, которое она только в будущем вернет; более того, ленивость иногда позволяет улучшить алгоритм асимптотически (есть статья про то, как один алгоритм из O(2^n) превращается в O(n) — из экспоненциального в линейный)), но также является причиной неочевидных утечек памяти. Вместо того, чтобы выполнять код, как это делается в императивных языках — строка за строкой, хаскель строит граф программы и проводит на нем редукцию, то есть о том, чтобы понимать, как именно происходит вычисление, вы можете забыть, поскольку это требует глубокого знания компилятора (причем в разных компиляторах все это реализовано по-разному).
Статья про то, как писать на хаскеле программы, которые используют все преимущества строгой типизации, так и называется — "Hasochism. The Pleasure and Pain of Dependently Typed Haskell Programming." ("hasochism" — от "haskell" и "masohism"). То есть их как бы можно писать, но никто этого не делает, потому что минусы значительно перевешивают плюсы.
Алгебраические типы данных и сопоставление с образцом очень удобны (поэтому они есть в Scala и Rust), и в императивных языках их не хватает.
Классы типов меня раздражают. В агде используется намного более адекватный механизм (который правда забагован).

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

Отредактировано троль (2015-07-15 19:10:49)

3

А, есть еще такое явление с громкоговорящим названием как "Cabal hell":
http://www.well-typed.com/blog/2014/09/ … ll-part-1/
http://www.reddit.com/r/haskell/comment … abal_hell/

Отредактировано троль (2015-07-15 15:40:25)

4

Ясно, спасибо за коммент.

А на Agda что пишете, какая прикладная область?

5

Так написал(а):

Ясно, спасибо за коммент.

Пожалуйста.

Так написал(а):

А на Agda что пишете, какая прикладная область?

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

6

троль написал(а):

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

В интерпретаторе можно выполнять код строка за строкой. Правда все это было намного удобнее еще в Delphi 7.

Отредактировано троль (2015-07-27 21:11:02)

7

Raytracing black holes with Haskell.