可读性强的Haskell (.lhs)和Haddock

41

目前我仅使用Haddock,但在看到一些非常有趣的例子(例如这个gist)中展示的literate Haskell之后,我有兴趣在项目中尝试一下。

我想问的问题是:

  • 您将什么写为Haddock注释,什么写在literate部分?

  • 如何将literate编程扩展到多个文件?谁能向我指出一个在多个模块中使用literate编程的包的示例?您在较大程序中使用literate编程的经验如何?

  • 哪种风格(markdown、latex等)的literate Haskell更受青睐?

  • 为什么要编写literate Haskell或纯粹的Haskell?是否都在使用这两种风格,如果是,为什么?

  • 您更喜欢块状风格(\begin{code})还是Bird风格(>)?为什么?


你能在Literate Haskell代码中使用Latex数学公式吗?如果可以,如何实现? - 1234
2个回答

36

我曾经写过很多文学编程

你在Haddock注释中写什么?在文学部分中写什么?

外部API文档写在Haddock注释中。其他所有内容都写在文学部分中。"其他所有内容"可能包括:

  • 数据结构的内部不变式
  • 为什么要这样做
  • 代码的设计
  • 为什么选择这种设计,尝试了哪些其他设计并且发现不合适

如何将文学编程扩展到多个文件?

与将大型LaTeX文档扩展到多个文件的方式相同:每个模块一个文件,然后有一个包含它们所有的巨大文件。

有人能给我指出一个使用多个模块的包中使用文学编程的例子吗?

虽然它不是Haskell,但Quick C-- compiler是一个使用文学编程编写的大型函数程序。

您在使用文学编程处理更大的软件包时的经验是什么?

Literate编程非常适用于记录棘手、困难或复杂的模块。对于大多数简单的模块,外部API文档(例如Haddock)已经足够了。没有哪一个Literate程序真正能够给你一个包含超过十几个模块的设计的总体印象。因此,你需要其他工具和技巧。
Markdown, LaTeX等的Literate Haskell更受欢迎是为什么?”
如果您进行这样重要的投资,我肯定会选择LaTeX,因为它具有数学功能和更强大的工具。
“为什么你在使用Literate Haskell或者普通的Haskell编程?你在两种风格中都进行编程吗?如果确实如此,为什么?”
我的Haskell代码几乎都是普通的,原因有两个:
我与有更多Haskell经验的高级人员共事,他们已经放弃了Literate Haskell。只有他们系统中最古老的模块有任何成为.lhs文件的可能性。
对于Haskell,Literate编程有点多余。Literate编程工具的一个很大好处是你不必受到编译器或语言定义可能对代码顺序施加的任何限制。但是Haskell几乎没有这样的限制:没有定义先于使用,并且对于典型的函数定义,我可以选择let绑定或where绑定辅助名称(或两者都有)。Literate编程从来不仅仅是花哨的注释,而对于“literate” Haskell,你所得到的就是这些。这非常麻烦,不值得。

你更喜欢块状样式(\begin{code})还是鸟状样式(>)?为什么?

我强烈偏爱块状样式:

  • 它几乎与全球所有其他文学编程工具兼容。(鸟状样式只适用于Haskell。)

  • 我的编辑器更适应块状样式。


10
如果您打算在互联网上共享程序,我发现将literate haskell与markdown样式结合使用,并加入mathjax是一种很好的选择。程序"Pandoc"非常出色,可将此“markdown+lhs”转换为所需的任何格式,包括PDF或HTML。如果您告诉Pandoc输出HTML,则可以使用-mathjax(或其他类似的标志,如果您喜欢)以呈现您的latex数学公式。
在使用此样式时,我发现bird样式更受欢迎,因为它对我来说更易读,并且似乎更符合markdown样式。
使用Pandoc和Markdown的好处是,您可以将引文添加到代码、数学公式中,并具有真正的可移植格式。您可以构建类似于科学研究论文但可执行并且也可以发布到博客/维基/网站等的东西。
就Norman所说的文学编程对于清晰的代码排列有用的另一个观点,可以认为Haskell足够表达代码所解决的问题,实际上可以通过解释性文本来获得更好的效果。想象一篇数学研究论文。纯数学中的好论文有很多文字来解释数学符号的动机或高级别的解释。例如,在关于Navier-Stokes方程的论文中,将方程符号与解释它与牛顿动量守恒的关系的文字结合起来是非常有用的。
总之,我使用并推荐使用markdown+lhs样式、美元符号嵌入latex数学公式、鸟瞰图样式和pandoc,并将编写程序视为撰写数学研究论文,并像撰写数学研究论文一样对待Haskell本身。

1
你有没有一个以这种风格编写的文件示例可以分享? - Doug McClean
LHS和Markdown提供了一些有关在网络上共享/发布.lhs文件的更多信息。 - imz -- Ivan Zakharyaschev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接