我对这是什么有一个粗略的想法,但如果有人对“表达问题”的解释他们认为简洁直观我很乐意听到它。
答案 0 :(得分:39)
观看this lecture。
这个想法是你的程序是数据类型和操作的组合。该问题要求实现允许添加类型和新操作的新案例,而无需重新编译旧模块并保持静态类型安全(无需强制转换或运行时类型检查)。
有趣的是,在函数式编程语言中,添加新操作很容易,但很难将案例添加到数据类型中。而在OO语言中则是另一种方式。这是两种编程范式之间的重大概念差异之一。
答案 1 :(得分:15)
问题背后的想法是文本是一维的。即使你有行和列,你通常一行一字地逐行阅读。编译器也是如此。
并且您尝试在其中表示某种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))
在处理抽象类时,您通常会遇到这个问题:将新子类型添加为新模块非常容易,但是当您添加新的抽象方法时,您需要触摸所有模块和加上它;你需要在很多地方做同样的事情。通常你会抽象来防止这些重复的事情。
只要您使用1D表示,就无法解决此问题。
这个问题的解决方案是一个编辑器,它可以让你像真正的表一样编辑这些表,而不是像文本一样(在Excel视图中,你可以方便地添加新的列和行)。
答案 2 :(得分:1)
还有this article about solving the problem with Clojure,但问题出现在Java中,所以即使你不了解Clojure也应该有意义,特别是在小图表的帮助下。