函式式程式設計總結

2021-08-17 07:29:25 字數 1334 閱讀 1416

尾遞迴解決的是棧的記憶成本,更好防止堆疊溢位。

遞迴在兩種情況下會掛:一是沒有結束條件;二是堆疊記憶體超過了最大限制。

1、柯里化

柯里化是一種「預載入」函式的方法,通過傳遞較少的引數,得到乙個已經記住了這些引數的新函式,某種意義上講,這是一種對引數的「快取」,是一種非常高效的編寫函式的方法。

2、高階函式

函式當引數,把傳入的函式做乙個封裝,然後返回這個封裝函式,達到更高程度的抽象。

3、尾呼叫優化

指函式內部的最後乙個動作是函式呼叫。該呼叫的返回值,直接返回給函式。

函式呼叫自身,成為遞迴。如果尾呼叫自身,就稱為尾遞迴。

遞迴需要儲存大量的呼叫記錄,很容易發生棧溢位錯誤,如果使用尾遞迴優化,將遞迴變為迴圈,那麼只需要儲存乙個呼叫記錄,這樣就不會發生棧溢位錯誤了。

4、範疇與容器

函子(functor): 用於將乙個範疇轉成另乙個範疇。

函子是函式式程式設計裡最重要的資料型別,也是基本的運算單位和功能單位。它首先是一種範疇,也就是說,是乙個容器,包含了值和變形關係。比較特殊的是,它的變形關係可以依次作用於每乙個值,將當前容器變形成另乙個容器。

任何具有 map 方法的資料結構,都可以當作函子的實現。

函式式程式設計一般約定,函子有乙個 of 方法,用來生成新的容器。函子的標誌就是容器具有 map 方法。該方法將容器裡面的每乙個值,對映到另乙個容器。

5、either 函子

內部有兩個值:左值和右值。右值是正常情況下使用的值,左值是右值不存在時使用的預設值。

left 和 right 唯一的區別就在於 map 方法的實現,right.map的行為和我們之前提到的map函式一樣。但是left.map就很不同了:它不會對容器做任何事情,只是很簡單地把這個容器拿進來又扔出去。這個特性意味著,left 可以用來傳遞乙個錯誤訊息。

6、ap函子

函子裡面包含的值,完全可能是函式。我們可以想象這樣一種情況,乙個函子的值是數值,另乙個函子的值是函式。

class ap extends functor 

}

注意,ap方法的引數不是函式,而是另乙個函子。

7、monad

monad是一種設計模式,表示將乙個運算過程,通過函式拆解成互相連線的多個步驟。你只要提供下一步運算所需的函式,整合運算就會自動進行下去。

promise 就是一種 monad 。

monad 讓我們避開了巢狀地獄,可以輕鬆地進行深度巢狀的函式式程式設計,比如 io和其它非同步任務

阮一峰  函式式程式設計入門教程

函式式程式設計總結

函式式程式設計是圍繞高階函式進行的,設計的核心在於高階函式的設計。1 函式式程式設計通過函式的復合生成更大的結構 2 函式的操作分為分解和復合 分解即為柯里化,可以分為偏函式分解和徹底分解。復合即為待定係數和呼叫約定。3 函式的運算最終轉化為代數運算。4 monad的本質是簡化版的物件,與閉包類似 ...

資源總結 函式式程式設計

首推coursera上的programming languages,公認的神課了 雖然我cs的朋友聽了一半覺得太簡單沒聽下去但是感覺對我幫助還蠻大的 不過作業量也真是大233 不單單講函式式程式設計,我覺得重點是對語言的特性能有進一步的了解 此外按習慣會在hankerrank刷刷題 haskell的...

函式式程式設計中常用的函式(總結)

1.函式式程式設計的含義 函式式程式設計是一種程式設計的基本風格,就是構建程式的結構和元素的方式。函式式程式設計將計算過程看做是數學函式,也就是可以使用表示式程式設計。在函式的 中,函式的返回值只以來傳入函式的引數,因此使用相同的引數呼叫2次就會得到相同的結果。如果說這段話很難理解,我覺得可以這麼想...