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一樣的顯示效果,在這裏你可以方便地添加新的行和列)。