2009-09-17 74 views

回答

1

遞歸。有時很難包裝你的頭周圍

+5

確實。在這裏看到這個答案: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

+0

笑(); void laugh(){print(「ha」);笑(); }儘管這最終會導致類似這個網站的名稱; ^) – Toad 2009-09-17 12:53:36

+0

如果您的語言支持尾遞歸,則不會。;) – mipadi 2009-09-17 20:04:40

6

我想說First-class functions.

在計算機科學中,編程 語言據說支持 一流的功能(或功能 文字),如果它把功能作爲 第一類對象。具體而言, 這意味着該語言支持 的 執行的程序的過程中構造新的功能, 將它們存儲在數據結構中,將它們作爲 其他函數的參數,以及 返回它們作爲其他 函數的值。這個概念並不包括 語言外的任何方式和 程序(元編程),例如 調用編譯器或函數 來創建一個新函數。

+0

它有用嗎? o_O – 2009-09-17 12:47:32

+0

不僅有用但功能強大。例如,即使語言不支持它,也可以模擬OOP。見例如:http://javascript.crockford.com/prototypal.html – 2009-09-17 12:52:01

+2

不是很難,在我看來... Monads肯定是一個數量級更難... – em70 2009-09-17 17:29:06

8

包裝我身邊經過連續式機頭,幫助我的JavaScript編碼很多

1

高階函數的概念,lambda函數和易於組合的泛型算法的功能對我來說非常有用。當我看到我可以用哈斯克爾摺疊做什麼時,我總是很興奮。 同樣,自從我進入函數式編程(具體而言,haskell)以來,我在C#中的編程改變了很多(我希望更好)。

6

您是否想要測量與功能編程本身或一般編程有關的用處?

一般來說,函數式編程的積極經驗沒有從具體的技術結果,而是來自它的方式改變了你的思維 -

  • 保持不變的數據
  • 聲明制定(遞歸,模式匹配)
  • 處理功能數據

所以我說,函數式編程是回答你的問題本身。

但要給出更具體的答案也一樣,我會投給功能抽象機制,例如

  • 單子
  • arrows
  • 延續傳遞風格
  • zippers
  • higher-命令函數
  • 泛型+類型類。

前面已經說了,他們都非常的第一個視圖抽象的事情,但是一旦你瞭解他們,他們都非常冷靜和旅遊居停技術編寫簡潔,錯誤的安全和最後但並非最不重要高度可重複使用的代碼。

比較下面的(僞):

// Concrete 
def sumList(Data : List[Int]) = ... 

// Generic 
def sumGeneric[C : Collection[T], T : Num](Data : C) = ... 

與第一定義相比,後者可能有點不直觀,但它可以讓你與任何收集和數字類型一般工作!總而言之,許多現代(主流)語言已經發現了這樣的好處,並引入了非常實用的功能,如lambda功能或Linq。瞭解了這些技術後,也將改進以這種語言編寫代碼。

+0

我同意你的第一個五條建議,但是#6(泛型)不是特定於函數式編程語言的 - 例如, Java支持具有邊界的類型參數,因此可以像上面那樣表達您的sumGeneric。 – 2013-02-15 08:46:16

3

一個來自「高級」部門:用幻像類型編程(有時也稱爲索引類型)。無可否認,它不是函數式編程中的「標準」技術,但也不完全是深奧的,它可以讓你的大腦忙碌一段時間(你問了一些困難的東西,對吧?))。

簡而言之,它是關於參數化類型在編譯時進行編碼和靜態執行某些屬性的。其中一個標準示例是矢量相加函數,它可以靜態確保給定的兩個長度爲N和M的向量將返回一個長度爲N + M的向量,否則會出現編譯時錯誤。是的,還有更多有趣的應用程序。

這些技術在C++中並不像在正確的函數式編程語言中那麼有用,但到目前爲止,我已經設法在不同程度上潛入我所有最近的項目中,最近在一個C++ EDSL上下文中得到了很好的解決。例如,您不一定需要編碼花哨的東西,學習這有助於我瞭解幾種類型標籤可以減少EDSL的冗長度或允許更清晰的語法的情況。

不可否認,有用性受到語言支持和您試圖達到的目標的限制。

一些首發:

Generic and Indexed Type (slides with some brief applications overview)

Fun with Phantom Types

在幻燈片中提到的肯尼迪和魯索紙Generalized Algebraic Data Types and Object Oriented Programming並提出了一些這方面的東西到C#/ Java的背景下。

Dave Abraham的書C++ Template Metaprogramming中的第3章是available online as sample chapter並在C++中使用這些技術進行尺寸分析。

使用幻像類型的實用FP項目是HaskellDB。