haskell - 将 literate Haskell (.lhs) 转换为 Haskell (.hs)
问题描述
有没有一种简单的方法可以将读写的 Haskell 文件 ( .lhs
) 转换为常规的 Haskell ( .hs
) 源文件?
我认为可能有 GHC 选项,但 GHC 手册似乎没有太多关于识字程序或.lhs
格式的信息。“识字”这个词甚至没有出现在索引中!
Wiki 上的Literate programming链接包括指向在“bird”和“ \begin{code}
.. \end{code}
”样式之间转换或转换.lhs
为 TeX 格式的脚本的链接,仅此而已。
解决方案
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
缩进了两个空格,这可能是一个缺点。
推荐阅读
- redux - Redux 在 ui 上创建新对象
- scala - 具有相同运行时类但不同静态类型的对象的不同性能
- android - 如何获取 Spinner 值以保存在变量中
- c# - await Task.Delay(0) Runs OK but await Task.Delay(1000) Does not
- html - iframe 的对齐方式
- entity-framework - 无法更新数据库以匹配当前模型...但仅在两个应用程序之一上
- flutter - FLUTTER:如何知道用户是否退出了退出应用程序?
- python - fit_generator 期望所有神经网络层的输入?
- java - JavaFX 不会导入
- shopify - Shopify 通过应用与产品页面 HTML 交互