Преобразование грамотных Haskell (.lhs) в Haskell (.hs) - PullRequest
1 голос
/ 05 февраля 2020

Есть ли простой способ конвертировать грамотный Haskell файл (.lhs) в обычный Haskell (.hs) исходный файл?

Я думал, что это может быть GH C вариант, но руководство GH C не содержит много информации о грамотных программах или формате .lhs. Слово «грамотный» даже не встречается в индексе!

Ссылка Грамотное программирование в вики содержит ссылки на скрипты, которые конвертируют между «птицей» и «\begin{code} ..». \end{code} "стили или конвертируйте .lhs в формат TeX, но это все.

1 Ответ

1 голос
/ 08 февраля 2020

GH C сама использует отдельную программу C с именем unlit для обработки .lhs файлов. Возможно, вы найдете его установленным где-то в вашей установке GH C. Если вы запустите его, он покажет несколько параметров командной строки без объяснения:

$ cd ~/.stack/programs/x86_64-linux/ghc-8.6.4/lib/ghc-8.6.4/bin
$ ./unlit
usage: unlit [-q] [-n] [-c] [-#] [-P] [-h label] file1 file2

Копаясь в исходном коде, похоже, что параметры:

-q   "quiet": ignore certain errors, so permit missing empty lines before and after
     "bird" style and accept completely empty programs
-n   (default) "noisy": opposite of -q, so be noisy about errors
-c   "crunch": don't leave blank lines where literate comments are removed
-#   delete lines that start with "#!"
-P   suppress CPP line number pragma, but only matters if `-h` is supplied
-h   File name for an initial `#line` pragma

Итак, команда строка:

$ /path/to/unlit -c myfile.lhs myfile.hs

, вероятно, хорошо справится с преобразованием myfile.lhs:

This is a literate program

> main :: IO ()

using both code styles
\begin{code}
  main = putStrLn "hello"
\end{code}

в "неграмотную" программу myfile.hs:

  main :: IO ()
  main = putStrLn "hello"

Для стиля «птица» он фактически заменяет символ «>» пробелом и оставляет оставшуюся часть отступа на месте, поэтому для моего примера выше обе строки в myfile.hs имеют два пробела, что может быть недостатком .

...