Programming languages 什么是';表达式问题';?

Programming languages 什么是';表达式问题';?,programming-languages,functional-programming,computer-science,Programming Languages,Functional Programming,Computer Science,我大致知道这是什么,但如果有人对“表达问题”有一个他们认为简洁直观的解释,我很乐意听到。观看 其思想是,您的程序是数据类型及其操作的组合。这个问题需要一个实现,该实现允许添加新的类型案例和新操作,而无需重新编译旧模块并保持静态类型安全(无强制转换或运行时类型检查) 有趣的是,在函数式编程语言中,很容易添加新操作,但很难向数据类型添加案例。而在OO语言中,情况正好相反。这是两种编程模式在概念上的巨大差异之一。也有,但是问题是在Java中出现的,因此即使您不了解Clojure,也应该有意义,特别是借

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

观看

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

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

也有,但是问题是在Java中出现的,因此即使您不了解Clojure,也应该有意义,特别是借助于小图表

上面说:

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


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

你试着用它来表示某种2维或更高维的数据。例如,按行顺序排列的表如下所示:

((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))
在处理抽象类的实践中,您通常会遇到这个问题:添加一个新的子类型作为一个新的模块是非常容易的,但是当您添加一个新的抽象方法时,您需要接触所有的模块并添加它;在很多地方你都需要做同样的事情。通常情况下,您进行抽象是为了避免这些重复的事情

只要使用一维表示,就没有解决此问题的方法


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

考虑到这是一个相当复杂的概念,我不确定你会用“简洁直观”的解释走得很远,尽管我很高兴被证明是错的!不开玩笑:)一个不完整(可能有点不准确)但有启发性的隐喻就足够了。另请参见。这里有一个解决方案,展示了如何在Clojure(函数式编程)中解决表达式问题@elnygren我提出了你的要点,并用Haskell替换了你的代码:还有一个Scala例子:现在有一个。