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. Ну и да, доколе в квазицитатах нельзя сплайсить имена?


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

привычнее :)

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

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

Каждый божий день радуюсь, что этим никто не пользуется.

Да ладно (mfix, не обязательно в виде mdo), берем любую гуйню: на сигнал вешается «callback», возвращается (через IO) «connnector», как в «callback» отписаться от сигнала?

// если вы ответили IORef, то поздравляю с велосипедом

anonymous
()
Ответ на: комментарий от 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

Гуйня на коллбеках ненужно. Ну и да, IORef лучше очередного путешествия в GHC User Guide за выяснениями, что именно хотел сказать автор.

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

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

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

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

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

Гуйня на коллбеках ненужно.

not bad, вы готовы распостранить сие вне хаскеля, если «да», то на какие языки? И что предложите для сабжа (готовое, не дописывать жа свои «ненужные коллбеки»).

Ну и да, IORef лучше ..

rec .. -> (без сахара) -> mfix -> (IO instance) -> fixIO -> IORef
Хотя может «что именно хотел сказать автор» в случае IORef будет проще, чем rec?)

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от anonymous

not bad, вы готовы распостранить сие вне хаскеля, если «да», то на какие языки?

Пас.

И что предложите для сабжа (готовое, не дописывать жа свои «ненужные коллбеки»).

reactive-banana[-wx] выглядит довольно мило.

Вообще я бы предложил не писать гуи.

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

reactive-banana[-wx] выглядит довольно мило.

Да, но «полный» ли: придется свое дописывать. И gtk бы не помешал (свой можно и на коленке, но хочется юзабельного). В общем «ненужно» пока в теории.

Вообще я бы предложил не писать гуи.

Вариант, но (лично мне) чтоб быть последовательным придется выкинуть vision и hbro.

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

hbro уже можно юзать?

С трудом, нo какое-то время я провел на uzbl, так что не привыкать). С плясками вокруг js туго: обхожусь console.log + webView `on` consoleMessage + MVar.

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