9

有一個想法:功能(在FP中)可以用與OOP中的組件類似的方式組成。對於OOP中的組件,我們使用接口。對於功能我們可以使用代表。目標是實現分解,模塊化和互換性。我們可以使用依賴注入來簡化它。功能語言中的分解(模塊化)

我試圖找到有關該主題的內容。沒有運氣。可能是因爲沒有足夠大的功能程序來需要這個功能?在搜索用FP編寫的企業級應用程序時,我發現了這個列表。 Functional Programming in the Real Worldthis paper。 我希望我錯過了FP的殺手級應用程序,它的大小足以應付分解。

問題:你可以展示體面的現實世界的FP應用程序(最好是開源),它使用分解到模塊?

獎勵喋喋不休:什麼是常用的模式?什麼樣的功能通常分解成單獨的模塊?這些實現是否曾經爲了測試目的而被嘲笑?

+0

我不熟悉名爲「代表」的FP概念。你指的是什麼? – Chuck 2010-09-22 23:04:10

+0

這是C#/ F#的概念。強類型函數 - 函數類型。類似於Java中單一方法的接口。請參閱http://msdn.microsoft.com/en-us/library/dd233206.aspx – 2010-09-22 23:27:14

+0

剛發現有趣的相關論文http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.143.2712&rep= REP1&類型= pdfq =官能%20programming%20decomposition&EI = FY6aTOKvKcbxOf2cxaIP&USG = AFQjCNHZ39lndEyDRhmXzO-7O0s22ZQ1Jg&SIG2 = LtfPcDLYIPljaqR6uc-D5A及CAD = RJA – 2010-09-22 23:33:02

回答

5

前段時間我正在學習F#並想知道同樣的話題,所以我問了一下quality open source projects to learn from

在函數式編程中你沒有看到任何類似於依賴注入的東西的原因是它只是「自然」的,因爲你只是通過傳遞或組合函數來「注入依賴」。或者像這篇文章所說的那樣,「Functional dependency injection == currying」,但那只是一個機制。

嘲笑框架是沒有必要的。如果你需要模擬一些東西,你只需傳遞一個「存根」功能。請參閱this question about real-world Scala applications

+0

好指針,好方向。讓我稍微討論一下。看來你打算在根方法調用上傳遞組件函數。由於我通常在現實世界的OOP應用程序中編寫數百個組件,因此很難。柯里文章建議你可以讓語言從本地上下文中選擇組件(?closure?)。對,但我可以想象只有分層的上下文。也許我可以傳入包含命名組件(有效容器)的結構並按名稱解析組件函數。但那是後期的綁定/服務定位器。我是在重新創造一些東西嗎? :-D – 2010-09-23 19:35:23

+0

@Pavel:老實說,我還沒有在FP中構建過任何這種規模的東西,但我迄今爲止使用F#的經驗是,我不覺得對服務定位器/ IoC有任何需求,並且從某人一個真正的OOP中的IoC迷:-) – 2010-09-23 19:53:42

+0

@Pavel:也許這是因爲FP中的「依賴」實際上只是函數,所以它們變得更加細化,即不是傳遞一個完整的IRepository,如果你需要保存一個實體'你只需傳遞一個函數'Entity - > unit',它可以與任何符合該簽名的東西輕鬆交換。 – 2010-09-23 19:55:58

4

要麼我們在交叉目的下討論(這可能是:我對OOP術語不太熟悉),或者你對函數式編程缺失了很多。模塊和抽象(即可互換性)基本上是以功能語言CLU發明的。關於抽象類型的開創性論文是James Morris的Protection in programming languagesTypes are not sets。後來,模塊系統和抽象的大部分改進都來自函數式編程世界,通過類似ML的語言。

函數式編程的殺手級應用程序通常被認爲是符號操作。大多數函數式語言的編譯器都是用語言本身編寫的,所以你可以查找你最喜歡的函數式語言實現的來源。但幾乎任何非平凡的程序(功能與否)都是在某種程度上以模塊化的方式編寫的 - 也許我錯過了有關「分解」的含義?模塊化將更加明顯,並使用高級模塊系統的強類型語言使用更先進的概念,例如Standard MLObjective Caml

+0

是的,我還是新來的FP。不,我不是指模塊作爲(記憶)保護的工具。我的意思是說模塊是你可以取代的東西。在強類型語言中,它是組件的接口。我將看看編譯器的代碼。它讓我對FP-immutability與AST和FP-no-side-effects與代碼文件有關的問題產生疑問,我想知道這是否是FP代碼的好/好例子。無論如何非常感謝。 – 2010-09-23 19:17:29

+0

@Pavel:我也不是指記憶保護。我正在討論模塊=可替換組件和抽象=可替換性(以及模塊系統=涉及模塊的編程語言的一部分)。函數式編程,模塊系統和不變性在很大程度上是正交的概念,儘管它們在一起工作的很好。 – Gilles 2010-09-23 20:32:18