2010-01-05 55 views
24

我的相關問題框與函數式編程問題溢出。在審查了最相關的內容之後,我仍然很想聽聽以下意見:功能語言的建築思維

您如何看待在功能語言中構建應用程序?

我不是在談論一個特定語言的語法。我對概念組織範例感興趣(例如面向對象)。與許多人一樣,我第一次使用封裝和代碼重用來自OO背景。由於我一直在研究不同的語言,函數式編程確實引起了我的注意。我開始掌握不變性,高階函數等等的好處。但是我仍然失去了如何構建功能性應用程序的感覺,而又不會回到面向對象的概念。實際上,我見過的許多功能性示例與spaghetti代碼有更多相同之處,儘管我確信這是由於示例的簡單性,而不是功能性方法中的任何固有缺陷。

這個問題是近親「的時候,我應該使用函數式編程,」但我已經滿足了自己的功能性做法,儘管在某些領域的利弊,是可用於幾乎你想要的任何東西。我無法描繪複雜應用程序的全景圖組織。

+0

重複:http://stackoverflow.com/questions/1549017/advice-on-learning-how-to-think-functional http://stackoverflow.com/questions/192090/how-do-you-design-一個功能程序 – 2010-01-05 02:28:28

+0

請在發佈新問題之前嘗試搜索:http://www.google.com/search?hl=zh-CN&q=structure+functional+language+site:stackoverflow.com – 2010-01-05 02:29:48

+8

感謝您提供有用的鏈接線。但是,我在網站上搜索了很長時間,沒有發現任何看起來直接相關的內容。顯然,我沒有使用正確的術語來產生上面的鏈接。如果假設用戶在近500k其他人中找不到類似問題,那麼用戶甚至沒有嘗試搜索,這是否是標準做法? – DanielMason 2010-01-05 05:18:56

回答

2

大多數整體設計模式是完全適用的:

分離問題;模型 - 控制 - 演示(所有變體);分層建築;輸入 - 處理 - 輸出等

一旦你分解一個大問題成更小問題,小問題是通過各種轉換工作從源到目的地代表性的問題。

我發現輸入處理輸出模式和轉換管道模式的幫助。

+0

感謝您的一個很好的答案。我對編程相當陌生,對我來說很多這些術語並不熟悉 - 這是一件好事,更多需要探索。維基百科上的幾個小時都無法治癒。 – DanielMason 2010-01-05 02:12:10

21

在70年代末,芭芭拉里氏等人開發的,目前仍在廣泛應用的今天和大型的「面向對象設計」技術適用不變函數式編程勿庸置疑。它們最容易使用具有顯式接口和實現的語言來應用,這意味着標準ML(其中接口被稱爲「簽名」和實現被稱爲「結構」或「函子」)或Objective Caml(其中接口被稱爲「模塊類型「和實現被稱爲」模塊「)。如果您更喜歡Scheme,那麼由Matthew Flatt和Matthias Felleisen開發的「單元」語言就被納入PLT計劃,並且是表達大型職能的一種非常好的方式。

簡單:

  • 組織各地抽象類型應用程序(班OO,在FP「抽象類」)和這些類型的操作。

  • 使用封裝機制(班OO,在FP模塊),以隱藏自己的抽象類型的表示。

  • 結構應用程序,使每個實現依賴於其他實現間接通過其接口。通過這種方式,您可以限制構建或修改任何一個應用程序所需的代碼量。

  • 去城裏!

主要區別在於,當你編寫函數式程序時,你不使用繼承來重用實現。而是使用高階函數,或者使用modules which take other modules as parameters

總結:在架構層面上,沒有太多區別,但是在使用函數式語言時,您可能需要更加努力地尋找所需的封裝機制。

+0

真棒回答。一般來說,模塊採取模塊參數方法是否存在性能缺陷,還是僅僅花費你一個指針? (Javascript是我對此的心智模型) – DanielMason 2010-01-05 02:10:52

+0

@DanielMason:對於一個天真的編譯器,您付出的代價與面向對象的語言相同:模塊由指向vtable的指針表示。但是更好的編譯器在跨越模塊邊界的小函數上做了很好的工作,所以它們的開銷較小。 MLton是一個非常好的全程序編譯器,所以根本沒有運行時間開銷。 http://mlton.org/ – 2010-01-05 02:52:35

+0

謝謝你的跟進。這給了我很多深入的研究。 – DanielMason 2010-01-06 05:45:51