什么是'表达问题'?

Jam*_*mes 46 computer-science programming-languages functional-programming

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

Dan*_*kov 42

这个讲座.

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

有趣的是,在函数式编程语言中,添加新操作很容易,但很难将案例添加到数据类型中.虽然在OO语言中,它是相反的.这是两种编程范式之间的重大概念差异之一.

  • 这是一个解决方案,展示了如何在Clojure(函数式编程)中解决表达问题的方法https://gist.github.com/elnygren/e34368a86d62f0cb75f04ba903f7834a (3认同)
  • @elnygren我分叉了您的要旨,并用Haskell替换了您的代码:https://gist.github.com/chrisdone/7e07b3a90474542c9d1ebef033c1ee6e (3认同)
  • 这里还有一个带有Scala示例的分支:https://gist.github.com/izmailoff/41c7f790eb97042c307885388754aa0be (3认同)

Cal*_*ius 18

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

并且您尝试在其中表示某种2维或更多维数据.例如,行 - 市长顺序的表格如下所示:

((A, B, C), (D, E, F), (G, H, I))
Run Code Online (Sandbox Code Playgroud)

在此表示中,最后添加一个新行非常容易,而不触及其余部分:

((A, B, C), (D, E, F), (G, H, I), (J, K, L))
Run Code Online (Sandbox Code Playgroud)

但添加列有点问题,你需要触摸4个不同的地方:

((A, B, C, M), (D, E, F, N), (G, H, I, O), (J, K, L, P))
Run Code Online (Sandbox Code Playgroud)

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

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

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