33

我对这是什么有一个粗略的想法,但如果有人解释他们认为简洁直观的“表情问题”,我很乐意听到它。什么是“表达问题”?

+6

是某种讽刺的问题,还是一个微妙的笑话? – x0n 2010-08-29 20:35:48

+0

鉴于这是一个合理的参与的概念,我不能确定你会走得很远了“简洁,直观的”的解释,但我很乐意被证明是错误的! – Gian 2010-08-30 12:06:00

+0

没有笑话:)一个不完整的(可能稍微不准确)但照亮的隐喻就足够了。 – James 2010-09-14 09:17:44

回答

33

手表this lecture

的想法是,你的程序是一种数据类型和操作在它的组合。该问题要求提供一种实现,该实现允许添加新类型和新操作的情况,而不需要重新编译旧模块并保持静态类型安全(不需要强制转换或运行时类型检查)。

有趣的是注意到,在函数式编程语言可以很容易地增加新的业务,但很难案件增加的数据类型。而以OO语言来说,这是相反的。这是两种编程范式之间的重大概念差异之一。

+1

这里有一个解决方案,展示了如何表达的问题可以用Clojure来解决(函数式编程)https://gist.github.com/elnygren/e34368a86d62f0cb75f04ba903f7834a – elnygren 2016-07-31 18:18:15

+1

@elnygren我叉你的要点,并与Haskell的更换你的代码:https://开头gist.github.com/chrisdone/7e07b3a90474542c9d1ebef033c1ee6e – 2016-11-02 11:36:43

+1

还有一个叉这里斯卡拉例如:https://gist.github.com/izmailoff/41c7f790eb97042c307885388754a0be – 2018-01-02 06:40:31

13

问题背后的思想是文本是1维的。即使你有行和列,你一般一行一行地逐行阅读。编译器也是如此。

,并尝试代表了某种在其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一样的显示效果,在这里你可以方便地添加新的行和列)。