首页 > 解决方案 > 将 literate Haskell (.lhs) 转换为 Haskell (.hs)

问题描述

有没有一种简单的方法可以将读写的 Haskell 文件 ( .lhs) 转换为常规的 Haskell ( .hs) 源文件?

我认为可能有 GHC 选项,但 GHC 手册似乎没有太多关于识字程序或.lhs格式的信息。“识字”这个词甚至没有出现在索引中!

Wiki 上的Literate programming链接包括指向在“bird”和“ \begin{code}.. \end{code}”样式之间转换或转换.lhs为 TeX 格式的脚本的链接,仅此而已。

标签: haskellliterate-programming

解决方案


GHC 本身使用一个独立的 C 程序unlit来处理.lhs文件。您可能会发现它安装在您的 GHC 安装中的某个位置。如果你运行它,它会显示一些命令行选项而没有解释:

$ 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缩进了两个空格,这可能是一个缺点。


推荐阅读