LINUX.ORG.RU

Glasgow Haskell Compiler 9.12.1

 , ,

Glasgow Haskell Compiler 9.12.1

0

5

Привет, ЛОР!

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

Среди особенностей новой версии:

  • Расширение языка OrPatterns, позволяющее давать общий обработчик нескольким веткам сравнения по образцу.
  • Поддержка многострочных строковых литералов через специальный синтаксис: """строка""".
  • В бэкенд компилятора добавлены экспериментальная поддержка архитектуры RISC-V и поддержка SIMD инструкций для архитектуры x86 (ранее требовалось использование LLVM).
  • Удалена поддержка 32-битных версий ОС Windows, macOS и iOS. Поддержка 32-битных систем на базе Linux и BSD нетронута.
  • Улучшена работа сборщика мусора. В некоторых случаях скорость работы программ может увеличиться на 25%.
  • И множество других мелких фич, багфиксов и так далее.

>>> Скачать

>>> Подробности

★★★★★

Проверено: dataman ()
Последнее исправление: CrX (всего исправлений: 4)
Ответ на: комментарий от AndreyKl

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

Да, мы отдалились.

Что скажешь?

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

При этом, я всё ещё думаю, что data Void1 a будет являться функтором, поскольку множества значений у типов Void1 a и Void1 b оба являются пустыми множествами (минус bottom, конечно же).

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 4)
Ответ на: комментарий от hateyoufeel

При этом, я всё ещё думаю, что data Void1 a будет являться функтором, поскольку множества значений у типов Void1 a и Void1 b оба являются пустыми множествами (минус bottom, конечно же).

Интересное уточнение. Как по мне, так похоже на правду, вроде бы мы можем поставить тривиальную стрелку в данном случае, но не могу сообразить до конца. Ушёл думать ( со мной тоже случается :) )..

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

Я руководствовался вот этим ответом здесь: https://math.stackexchange.com/a/475620

How many functions are there from a nonempty set S into ∅?

A function from a set A to a set B is a subset of A×B satisfying certain conditions, one of which is that its domain is A. If either A or B is empty, A×B=∅, and ∅ is therefore the only subset of A×B. If A≠∅, ∅ is not a function with domain A, so you’re quite right about (a): there are no such functions. If A=∅, though, it’s a different story. The domain of the function ∅ is {a:⟨a,b⟩∈∅}, which is … ?

Интересное уточнение. Как по мне, так похоже на правду, вроде бы мы можем поставить тривиальную стрелку в данном случае, но не могу сообразить до конца. Ушёл думать ( со мной тоже случается :) )..

Тут чуть проще. Поскольку функтор является маппингом из a -> b в A -> B, в нашем случае, это будет маппинг из множества функций с потенциально неограниченным количеством значений a x b в множество с ровно одним значением A x B, про которое ты и упомянул.

hateyoufeel ★★★★★
() автор топика
Последнее исправление: hateyoufeel (всего исправлений: 3)
Ответ на: комментарий от den73

Там полнофункциональный CPS. Но вот как сделать демонстрацию не-эскейп без присваивания я сходу не придумаю. Можешь придумать на Scheme без set!?

monk ★★★★★
()

«Нам хаскель строить и жить помогает!»

хотелось бы услышать реальные истории узбеков, от тех узбеков, которым хаскель помог строить и жить.

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

Я на самом деле не совсем понимаю, в чём ограничение escape. Если оно в том, что продолжение становится невалидным после завершения вычисления, которое его породило, то вот и проблема - мы один раз раскрасили код, разбор закончился и до свидания. Равно как и setjmp/longjmp вроде так делает. Всякие трюки с порядком вычисления же делаются на базе setcontext, а не setjmp. Не?

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от gns

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

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от den73

Если оно в том, что продолжение становится невалидным после завершения вычисления, которое его породило

Этого в хаскелевской монаде точно нет. Можно вообще вручную писать

f x = Cont $ \c -> c (x * 3)
g x = Cont $ \c -> c (x - 2)
monk ★★★★★
()
Ответ на: комментарий от den73

Да все собирается, в одну кнопку, все там хорошо. Если компилятор нужной версии поставить. Развели, блин, зависимостей... Не ждаваскрипт, конечно, но уже почти руби с питоном :)

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

Увы, я эту нотацию не понимаю, равно как и тебя. Чего «этого» там нет? Просто мне кажется, если есть абстракция вычисления, почему нельзя ввести операции над вычислениями (не запускающими ракеты), такие, как «скопировать» и «перезапустить»? Понятно, что это не входит в понятие монады, там всего два пункта, но может быть рядом что-то есть.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Ну как сказать... Вполне успех, если build.sh отрабатывает успешно при наличии тупо рекомендованной версии компилятора. А dependency hell — он у всех такой hell... :(

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

Чего «этого» там нет?

«продолжение становится невалидным после завершения вычисления»

Просто мне кажется, если есть абстракция вычисления, почему нельзя ввести операции над вычислениями (не запускающими ракеты), такие, как «скопировать» и «перезапустить»?

Можно. Например так

l = [putStrLn "1", putStrLn "2"]
l1 = take 1 l ++ [putStrLn "3"] ++ drop 1 l
main = sequence_ l1
monk ★★★★★
()
Ответ на: комментарий от monk

А, я понял, там на одной странице два вида продолжений описано. Ну ок, тогда хорошо. Нет повода не воспользоваться Хаскелем. Что же делать теперь? Я в лёгкой панике :)

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от gns

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

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Ну pandoc, тогда. Очень достойный конвертор форматов из отовсюду во всетуда. Тот же Касперский какие-то валидаторы правил на хацкеле пишет.... Как бы, хацкель --не серебряная пуля, скорее средство развития ума.

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

нет смысла парсить с нуля, если я поправил код в середине текста

Обычно для такого используют Rope структуру. Чтобы изменение символа требовало парсинг только одного куска. То есть не требуется парсинг не только части вначале, но и в других неизменённых местах. Возможно сделать более умное разделение, чтобы например при изменении обновлялось только выражение, и дальше вверх по дереву, функция, класс, модуль.

fuggy
()

Поддержка многострочных строковых литералов через специальный синтаксис: """строка""".

Почему во всяких маркдаунах используется ``` ``` а здесь не так?

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

Ну в принципе да, есть разные подходы. Хотя если открыть многострочный комментарий, то это затрагивает всё до конца текста. Или даже фигурную скобку. Тем не менее, эта задача когда-то была, решить не получилось, заноза осталась.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от fuggy

То есть не требуется парсинг не только части вначале, но и в других неизменённых местах.

Но как? Вставляю кавычку и до конца файла все строки становятся не строками и наоборот.

monk ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Ну, «Я знаю, что ничего не знаю» — уже путь к мудрости и обретению ума. Удачи Вам на этом пути и новых открытий!

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

А много ли вообще разных таких вариантов разборов? Может быть запомнить их все и при вставке кавычки переключаться на альтернативный?

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

В большинстве случаев не очень: «нормальный», «в комментарии», «в строке».

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

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.