LINUX.ORG.RU

В макросистеме Haskell обнаружен зонд! Шок!

 , , ,


0

1

В haskell (насколько я знаю) нет макросистемы.

Её подобие есть в GHC, реализованное через сплайс AST. Это, на первый взгляд, довольно удобно: снимается целый класс ошибок, связанный с парсингом текста, проще генерировать код и т. д.

Но с другой стороны мне кажется очевидным, что это же делает макросистему defective by design. AST — часть внутренней реализации компилятора, и её невозможно стандартизировать. Поэтому template haskell навсегда останется расширением GHC, либо разработчики альтернативных компиляторов должны будут писать библиотеки-обёртки GHC AST -> *HC AST невиданной кривизны, которые не будут предоставлять всё множество альтернативных расширений. Использовать макросистему, завязанную на внутренности одного компилятора — нонсенс.

Несмотря на то, что GHC-зонд буквально на виду, есть библиотеки, даже не предоставляющие альтернативного интерфейса без TH. Ein haskell, ein compiler, ein GHC!

Вопрос: какие альтернативные макросистемы можно было бы предложить?

P. S. Ну и да, доколе в квазицитатах нельзя сплайсить имена?


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

Эм.. вроде mdo движется в сторону deprecated, так что не «привычнее», а «уже идиоматичнее».

Хорошо было бы, если бы do rec делал тоже самое, что и mdo, группируя стрелки сам.

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

что и mdo, группируя стрелки сам

Дык, он и делает, но только для блока (=> более читаемо, ибо видно на что идет «fix»):

{-# LANGUAGE DoRec #-}

main = do
  rec a <- return c
      b <- return 2
      c <- return $ b + 1
  print [a, b, c]

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

группируя

хотя может что-то неправильно понял, потому что это не «группировка», а нахождение «fix-point» для кортежа (a,b,c) (относительно \ ~(a,b,c) -> return (c,2,b+1) ну b наверно оптимизиуется).

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

Ну, я особо не вчитывался в документацию, но понял так, что mdo сам группирует последовательные блоки в минимальные под-блоки do rec, т.е. mdo на выходе порождает портянку do с под-блоками do rec.

Просто в моем случае использование do rec на довольно большой кусок кода может быть менее эффективным, чем использование mdo, и здесь я думаю не о себе, а о пользователях библиотеки [1].

[1] Не рекламирую. Там у меня самописные монады с поддержкой MonadFix.

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

Вчитываться не надо, на поверхности:

First, similar to let-bindings, the rec is broken into minimal recursive groups, a process known as segmentation. For example:

.. but this is now deprecated. Instead of mdo { Q; e }, write do { rec Q; e }.

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

but this is now deprecated. Instead of mdo { Q; e }, write do { rec Q; e }.

Гугл дает эту фразу в контексте старого 6.12.3. В документации к последней Haskell Platform такой фразы не нашел. Пойнт в том, что do rec не заменяет mdo.

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

С технической стороны, не с математической! Пример есть в документации. Это еще называется «преждевременная пессимизация» :)

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

Но вернемся к тому, с чего я начал... Если они сделают do rec таким же как mdo, то почему бы и нет.

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