2013-02-25 35 views
-2

我很難理解'不要去想怎麼做,但要做什麼'(注重結果,而不是步驟)在函數式編程中。假設我們有一種語言把函數當作一等公民,並且沒有內置的迭代函數(比如Scala中的forAll)。在那種情況下,我們首先必須創建一個函數,告訴如何迭代給定的數據結構,而不是我們?因此,如果它自己的語言不能提供足夠的功能,那麼除了具有一等公民的功能之外,它與編寫命令式的編程方式大致相同嗎?在函數式編程中究竟是'怎麼做,怎麼做'或'關注結果,而不是步驟'

如果我錯了,請糾正我。以下是我提到的資源。

Video lecture

Some articles

+0

你從哪裏看到了「不要去想怎麼做,但要做什麼」的概念? – 2013-02-25 01:27:09

+0

請參閱[鏈接](http://msdn.microsoft.com/en-us/library/bb669144.aspx)。這是在第一個特徵 – 2013-02-25 01:35:08

+0

下解釋的任何人都做出了投票,請至少有禮貌地說出原因。 – 2013-02-25 01:56:54

回答

2

「如何」和「什麼」是同一枚硬幣的兩面,有時可以考慮以某種方式或其他有用的。思考「做什麼」是一種考慮遞歸的好方法,特別是對於沒有太多經驗編寫遞歸函數的人來說。 「如何」意味着一系列的步驟,而「什麼」意味着一系列的定義。讓我們考慮你的迭代示例(我將使用Haskell,因爲我不知道Scala,但概念應該是可直接翻譯的)。

Haskell的迭代函數被稱爲map,但假設我們想自己寫它。如果我們對遞歸沒有太多經驗,可能很難想象如何編寫一個函數(map),該函數將另一個函數(f)應用於列表的每個元素(「在list上映射」f)。下面是我們想要的功能的類型簽名:

map :: (a -> b) -> [a] -> [b] 

所以,讓我們試着思考「什麼」應用到列表的每個元素的功能。它是應用於第一個元素的函數,後面是映射到列表其餘部分的函數。所以讓我們編碼:

map f (firstElement:restOfList) = (f firstElement):(map f restOfList) 

現在我們差不多完成了。唯一剩下的就是處理基本案例。如果清單是空的呢?很明顯,映射到空列表的任何函數都是空列表,所以我們將編碼:

map _ [] = [] 

而且我們完成了!現在,如果你可以從「如何」的角度思考並編寫上述代碼,那就直接前進吧(因爲我已經獲得了更多的經驗,所以我更傾向於這樣做)。然而,如果你發現自己陷入困境,那麼從「什麼」的角度思考是一種有用的技術。