编程语言-什么是“表达问题”?

我对这是什么有一个大概的了解,但是如果有人对“表达问题”有一个解释,认为他们是简洁直观的,我很乐意听到。

3个解决方案
42 votes

观看本讲座。

这个想法是您的程序是数据类型和对其进行操作的组合。 问题要求实现一种实现,该实现允许添加类型的新案例和新操作,而无需重新编译旧模块并保持静态类型安全(无需强制转换或运行时类型检查)。

有趣的是,在函数式编程语言中,添加新操作很容易,但是很难向数据类型添加案例。 在使用OO语言时,情况恰恰相反。 这是两个编程范例之间最大的概念差异之一。

Daniel Velkov answered 2020-07-27T17:09:13Z
17 votes

问题的根源在于文本是一维的。 即使您有行和列,也通常会逐字逐行阅读。 编译器也是如此。

并且您尝试在其中表示某种二维或二维数据。 例如,按行市长顺序的表如下所示:

((A, B, C), (D, E, F), (G, H, I))

在此表示形式中,很容易在末尾添加新行,而无需触摸其余行:

((A, B, C), (D, E, F), (G, H, I), (J, K, L))

但是添加列有点麻烦,您需要在4个不同的地方触摸它:

((A, B, C, M), (D, E, F, N), (G, H, I, O), (J, K, L, P))

在处理抽象类时,通常会在实践中遇到这个问题:将新的子类型添加为新模块非常容易,但是当您添加新的抽象方法时,则需要触摸所有模块并添加它; 您需要在许多地方做同样的事情。 通常,您进行抽象以防止这些重复的事情。

只要使用1D表示,就无法解决此问题。

解决该问题的方法是使用一个编辑器,使您可以像编辑真实表一样而不是文本来编辑这些表(在Excel这样的视图中,您可以在其中方便地添加新的列和行)。

Calmarius answered 2020-07-27T17:10:01Z
2 votes

这篇文章中也有关于用Clojure解决问题的文章,但是问题是用Java提出的,因此即使您不了解Clojure也应该是有道理的,尤其是借助小图表。

其中说:

贝尔实验室的菲利普·沃德勒(Philip Wadler)在1998年通过电子邮件传播的未发表论文中创造了术语“表达问题”。正如他所说,“表达问题是旧问题的新名称。目标是通过案例定义数据类型, 在这种情况下,可以在不重新编译现有代码的情况下,向数据类型添加新的用例,并在数据类型上添加新的功能,同时保持静态类型的安全性(例如,不强制转换)。

Jared Updike answered 2020-07-27T17:10:30Z
translate from https://stackoverflow.com:/questions/3596366/what-is-the-expression-problem