关于编程语言:什么是’表达问题’?

What is the 'expression problem'?

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


看这个讲座。

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

有趣的是,在函数式编程语言中,很容易添加新的操作,但很难向数据类型添加事例。而在OO语言中则相反。这是两种编程范式之间概念上的巨大差异之一。


问题背后的想法是文本是一维的。即使你有行和列,你也通常逐字逐行地阅读它。编译器也是如此。

你试图在其中表示一些2维或更多维的数据。例如,行mayor顺序中的表如下所示:

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

在这种表示中,在结尾处添加新行非常容易,而不需要接触其余行:

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

但是添加列有点问题,您需要在4个不同的位置进行触摸:

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

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

只要使用一维表示,这个问题就没有解决方案。

这个问题的解决方案是一个编辑器,它可以让您像编辑真实的表一样编辑这些表,而不喜欢文本(在类似Excel的视图中,您可以方便地添加新的列和行)。


也有关于用Culjule解决这个问题的文章,但是这个问题在Java中给出,所以即使你不知道Culjure,它也应该是有意义的,特别是在小图表的帮助下。