這個問題當然是由Haskell的Monads啓發的。函數式編程中的哪些技術難以學習,但之後有用?
回答
遞歸。有時很難包裝你的頭周圍
確實。在這裏看到這個答案:http://stackoverflow.com/questions/1438558/what-techniqie-in-functional-programming-is-difficult-to-learn-but-useful-afterwa/1438569#1438569 – skaffman 2009-09-17 12:32:57
笑(); void laugh(){print(「ha」);笑(); }儘管這最終會導致類似這個網站的名稱; ^) – Toad 2009-09-17 12:53:36
如果您的語言支持尾遞歸,則不會。;) – mipadi 2009-09-17 20:04:40
在計算機科學中,編程 語言據說支持 一流的功能(或功能 文字),如果它把功能作爲 第一類對象。具體而言, 這意味着該語言支持 的 執行的程序的過程中構造新的功能, 將它們存儲在數據結構中,將它們作爲 其他函數的參數,以及 返回它們作爲其他 函數的值。這個概念並不包括 語言外的任何方式和 程序(元編程),例如 調用編譯器或函數 來創建一個新函數。
它有用嗎? o_O – 2009-09-17 12:47:32
不僅有用但功能強大。例如,即使語言不支持它,也可以模擬OOP。見例如:http://javascript.crockford.com/prototypal.html – 2009-09-17 12:52:01
不是很難,在我看來... Monads肯定是一個數量級更難... – em70 2009-09-17 17:29:06
包裝我身邊經過連續式機頭,幫助我的JavaScript編碼很多
我要說的是,Structural typing OCaml中是特別有意義的。
高階函數的概念,lambda函數和易於組合的泛型算法的功能對我來說非常有用。當我看到我可以用哈斯克爾摺疊做什麼時,我總是很興奮。 同樣,自從我進入函數式編程(具體而言,haskell)以來,我在C#中的編程改變了很多(我希望更好)。
您是否想要測量與功能編程本身或一般編程有關的用處?
一般來說,函數式編程的積極經驗沒有從具體的技術結果,而是來自它的方式改變了你的思維 -
- 保持不變的數據
- 聲明制定(遞歸,模式匹配)
- 處理功能數據
所以我說,函數式編程是回答你的問題本身。
但要給出更具體的答案也一樣,我會投給功能抽象機制,例如
前面已經說了,他們都非常的第一個視圖抽象的事情,但是一旦你瞭解他們,他們都非常冷靜和旅遊居停技術編寫簡潔,錯誤的安全和最後但並非最不重要高度可重複使用的代碼。
比較下面的(僞):
// Concrete
def sumList(Data : List[Int]) = ...
// Generic
def sumGeneric[C : Collection[T], T : Num](Data : C) = ...
與第一定義相比,後者可能有點不直觀,但它可以讓你與任何收集和數字類型一般工作!總而言之,許多現代(主流)語言已經發現了這樣的好處,並引入了非常實用的功能,如lambda功能或Linq。瞭解了這些技術後,也將改進以這種語言編寫代碼。
我同意你的第一個五條建議,但是#6(泛型)不是特定於函數式編程語言的 - 例如, Java支持具有邊界的類型參數,因此可以像上面那樣表達您的sumGeneric。 – 2013-02-15 08:46:16
一個來自「高級」部門:用幻像類型編程(有時也稱爲索引類型)。無可否認,它不是函數式編程中的「標準」技術,但也不完全是深奧的,它可以讓你的大腦忙碌一段時間(你問了一些困難的東西,對吧?))。
簡而言之,它是關於參數化類型在編譯時進行編碼和靜態執行某些屬性的。其中一個標準示例是矢量相加函數,它可以靜態確保給定的兩個長度爲N和M的向量將返回一個長度爲N + M的向量,否則會出現編譯時錯誤。是的,還有更多有趣的應用程序。
這些技術在C++中並不像在正確的函數式編程語言中那麼有用,但到目前爲止,我已經設法在不同程度上潛入我所有最近的項目中,最近在一個C++ EDSL上下文中得到了很好的解決。例如,您不一定需要編碼花哨的東西,學習這有助於我瞭解幾種類型標籤可以減少EDSL的冗長度或允許更清晰的語法的情況。
不可否認,有用性受到語言支持和您試圖達到的目標的限制。
一些首發:
Generic and Indexed Type (slides with some brief applications overview)
在幻燈片中提到的肯尼迪和魯索紙Generalized Algebraic Data Types and Object Oriented Programming並提出了一些這方面的東西到C#/ Java的背景下。
Dave Abraham的書C++ Template Metaprogramming中的第3章是available online as sample chapter並在C++中使用這些技術進行尺寸分析。
使用幻像類型的實用FP項目是HaskellDB。
- 1. 學習之前的技術Ionic Framwork
- 2. 學習函數式編程語言有多困難?
- 3. 學習函數式編程
- 4. 用於學習字符串模式的機器學習技術
- 5. Quake Live背後的技術有哪些?
- 6. 我應該學習哪些網絡技術?
- 7. 我應該爲Web開發學習哪些新技術?
- 8. Java技術學習路徑
- 9. 在學習LINQ to XML之前我應該瞭解哪些XML相關技術?
- 10. 壓縮技術有哪些?
- 11. 如果我使用ASP MVC 3,應該學習哪些新技術?
- 12. 學習新技術的最佳實踐
- 13. 學習JavaEE技術的項目
- 14. 哪些網站/博客,你會更喜歡學習先進的純CSS技術
- 15. 哪裏學習android編程?
- 16. 更大的項目有哪些技術?
- 17. 並行在XGBoost機器學習技術
- 18. .NET MVC是否必須學習技術?
- 19. 學習Java人臉識別技術
- 20. 哪些大學/學院教Microsoft ASP.NET和其他MS技術?
- 21. ADO.NET包含哪些技術?
- 22. 有哪些方法可以利用SecurID和類似的技術?
- 23. 需要一些建議來學習OCR相關技術
- 24. 這個網站使用哪些編程技術?
- 25. 函數式編程可以通過Scala學習嗎?
- 26. 那裏有哪些p2p技術?
- 27. PHP難以學習嗎?
- 28. 學習數據庫高可用性技術的好資源
- 29. 豐富的UI桌面應用程序有哪些技術?
- 30. 數學,編程和學習
在haskell的一個monad單詞後,我仍然不明白。 <> –
2009-09-18 11:57:34