Haskell中的识字编程真的是“吗?”;识字编程“;?

Haskell中的识字编程真的是“吗?”;识字编程“;?,haskell,literate-programming,Haskell,Literate Programming,我对识字编程的概念还不熟悉。我正在阅读有关这个主题的(PDF),一开始,在导言中,他说: 而不是想象我们的主要任务是指导计算机做什么 让我们集中精力向人类解释我们想要什么 一台电脑来做 他或她[识字编程的实践者]为一个程序而奋斗 这是可以理解的,因为它的概念是以一种全新的方式引入的 通过混合使用正式的 和非正式的方法相互加强 然后,进一步阅读: 程序的一个特点是它的结构关系。 一个复杂的软件由简单的部分和 这些部分之间的简单关系;程序员的 任务是陈述这些部分和这些关系, 以最适合人类理解的顺序-

我对识字编程的概念还不熟悉。我正在阅读有关这个主题的(PDF),一开始,在导言中,他说:

而不是想象我们的主要任务是指导计算机做什么 让我们集中精力向人类解释我们想要什么 一台电脑来做

他或她[识字编程的实践者]为一个程序而奋斗 这是可以理解的,因为它的概念是以一种全新的方式引入的 通过混合使用正式的 和非正式的方法相互加强

然后,进一步阅读:

程序的一个特点是它的结构关系。 一个复杂的软件由简单的部分和 这些部分之间的简单关系;程序员的 任务是陈述这些部分和这些关系, 以最适合人类理解的顺序- 不是按照某种严格确定的顺序,如自上而下或 自下而上

(……)

自上而下的编程让您对 你要去哪里,但它迫使你在你的生活中有很多计划 头部;悬念不断累积,因为在这之前没有什么是真正确定下来的 结束。编程有一个优点,那就是您可以持续使用 越来越多的功能强大的铅笔,因为越来越多的子程序被使用 构建;但它迫使你推迟整个计划 组织到最后一分钟,所以你可能会漫无目的地挣扎

因此,网络语言允许人们表达 以“意识流”顺序播放节目。纠纷 能够把一切都安排好 PASCAL编译器需要†。 网络的这一特性也许是它最大的资产

上面的摘录让我对这个主题感兴趣,所以我做了更多的调查。从任何搜索引擎提供的结果中都不难看出Haskell和识字编程之间的关系,但我看不到“最适合人类理解的顺序”。相反,我看到了一个做得非常好的文档,同时保持了计算机工作所需的顺序

  • 你能用“识字编程”这个术语来消除订单问题吗
  • 有没有其他不需要“意识流”顺序功能的识字编程定义
  • Haskell真的有编程能力吗(使用Knuth的定义)
最后,我个人认为,即使Haskell所做的(可能还有许多其他语言所做的)并不是Knuth所写的编程,当涉及到方法和算法的详尽描述时,我仍然喜欢这个想法。当注释远远超过代码时,它就起到了很大的作用



†WEB和TANGLE是D.Knuth第一次实现识字编程概念时使用的系统的一部分。

Haskell在大多数情况下在订购方面非常灵活。在Haskell模块中,所有声明和定义都可能以任何顺序出现。由于引用的透明性,提取子问题以便在其他地方实现它们也非常容易

顺序重要的主要领域是模式匹配。一个函数的所有方程都必须在一起,因为它们是按顺序匹配的,所以不能总是重新排序。然而,我不认为这是一个重大的限制,因为(a)这通常是非常本地化的,(b)具有大量方程的大函数可以(而且可能应该)重构为更小的部分,然后更容易重新排序

可能最烦人的约束是导入声明必须位于模块的顶部。这确实稍微打破了意识流,许多用Haskell编写的有文化的程序都是以这样的语句开头的:“不要介意这些导入,稍后你会看到我们需要它们的地方”。如果能够在文本中更自然的点上命名导入内容,从上下文中可以清楚地看出为什么需要导入内容,则更符合Knuth对识字编程的定义


除此之外,我认为Haskell对于有文化的编程非常有效。它可能并不完全符合Knuth的定义,但我认为它已经足够接近了。

在顶层,Haskell表达式可以是任何顺序(即使在函数中,您也可以通过巧妙地使用
where
let
,随心所欲地排序)。因此,如果你有一个非常复杂的模块,你可以先表达主要思想,这可能取决于它下面的定义,解释主要思想,然后将其分解为下面的部分。在Knuth与朋友设计TeX时,他选择标准Pascal编译器作为代码生成目标。标准Pascal对如何提供服务非常严格(这是为了获得一个单通道编译器),因此很难将代码写成散文。像Haskell这样的现代语言要宽松得多,这主要是如何将可运行代码与文档混合在一起的问题。我一直想知道为什么
import
语句需要放在文件的顶部。难道你就不能有一个预处理器来处理这些东西吗?这不是CWEB的基本功能吗?@Wes:是的,这就是CWEB的基本功能。但是,在语言和编译器中内置支持有很大的优势,如果没有它,我认为识字编程不会像Haskell博客社区中那样流行。这是大家熟悉的Haskell语法。您不必再学习CWEB的语法。@预处理器会带来额外的复杂性,因为您确实希望各种工具知道您有一个原始文档,而不仅仅是预处理器生成的修改副本。编辑一个不同于您应该编辑的文件的次数太多。