识字Haskell(.lhs)和Haddock

时间:2010-04-25 08:39:05

标签: haskell literate-programming haddock

目前我只使用Haddock,但在看到一些有文化的Haskell的非常有趣的例子(例如this gist)之后,我有兴趣在一个项目中尝试它。

我得到的问题是:

  • 你对Haddock的评论有什么看法?你在文盲部分写了什么?

  • 如何将识字编程扩展为多个文件?有人能指出我在一个包含多个模块的程序包中使用文字编程的例子吗?您在大型软件包中使用文字编程的经验是什么?

  • 首选Haskell的哪种口味(降价,乳胶,...)?

  • 为什么要用文字的Haskell或普通的Hillaell编程?你是在两种风格中编程吗?如果是这样的话,为什么?

  • 您更喜欢块式(\begin{code})还是鸟式(>)?为什么呢?

2 个答案:

答案 0 :(得分:35)

我曾经写过很多literate programs

  

你写了什么作为Haddock评论,你在文学部分写了什么?

外部API文档会进入Haddock评论。其他一切都进入了文化部分。 “其他一切”可能包括:

  • 数据结构的内部不变量
  • 为什么你这样做?
  • 代码的设计
  • 为什么选择这种设计,尝试和发现其他设计需要什么
  

如何将识字编程扩展为多个文件?

将大型LaTeX文档扩展为多个文件的方式相同:每个模块一个文件,然后是\include所有文件的巨型文件。

  

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

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

  

您在大型软件包中使用文字编程的经验是什么?

Literate编程非常适合记录棘手,困难或复杂的模块。对于大多数简单模块,外部API文档(例如,Haddock)就足够了。没有一个有文化的程序真的会给你一个包含十几个模块的设计的大局。为此,您需要其他工具和技术。

  

首选Haskell的哪种口味(降价,乳胶,...)?

如果您正在进行如此重大的投资,我肯定会因为数学能力以及该工具通常更强大的功能而选择LaTeX。

  

为什么要用文字的Haskell或普通的Hillaell编程?你是用两种风格编程的吗?如果是这样的话,为什么?

我的Haskell代码几乎总是普通的,有两个原因:

  • 我与拥有更多Haskell经验的资深人士合作,他们已经放弃了文化的Haskell。只有系统中最老的模块才有机会成为.lhs。

  • 对于Haskell来说,有文化的编程是多余的。文字编程工具的一大好处是,您可以摆脱编译器或语言定义可能对您的代码出现的顺序施加的任何约束。但是Haskell几乎没有这样的约束:在使用之前没有定义,对于典型的函数定义,我可以选择let - 绑定或where - 绑定辅助名称(或两者)。 Literate programming永远不仅仅是关于花哨的评论,而且“有文化的”Haskell就是你所得到的。这不值得打扰。

  

您更喜欢块式(\ begin {code})还是Bird式(>)?为什么呢?

我非常喜欢块样式:

  • 它与地球上所有其他文字编程工具大致兼容。 (鸟类踪迹是Haskell独有的。)

  • 我的编辑器更适合使用块样式。

答案 1 :(得分:11)

如果您打算在互联网上分享节目,我发现Markdown风格的识字haskell与mathjax的组合是一个很好的组合。 “Pandoc”程序非常出色,可以将“markdown + lhs”带到您想要的任何格式,包括PDF或HTML。如果你告诉Pandoc输出到HTML,你可以使用-mathjax(或者你喜欢的其他类似标志)来渲染你的乳胶数学公式。

使用这种风格时,我发现鸟类风格更受欢迎,因为它对我来说更具可读性,并且似乎更符合降价风格。

将Pandoc与markdown一起使用的好处在于您可以为代码,数学公式添加引文,并且具有非常便携的格式。您可以构建类似于科学研究论文但可执行的内容,也可以发布到博客/维基/网站。

为了给Norman提供另一个观点,他说文字编程对于更清晰的代码安排是有用的,可以说Haskell足够表达,你用代码解决的问题实际上很有趣,并且可以通过被包围真正受益带有解释性文字。想想一本数学研究论文。纯数学中的好论文有很多文本可以解释数学符号所表达的动机或更高层次的解释。例如,在一篇关于Navier-Stokes方程的论文中,围绕方程符号用文本解释它与牛顿动量守恒的关系将是非常有用的。

总之,我已经取得了很好的成功,并建议使用markdown + lhs风格,美元符号来嵌入乳胶数学公式,鸟类风格和pandoc。我建议像编写研究论文一样编写程序,像对待研究论文中的数学表达一样对待haskell本身。