導航:首頁 > 編程語言 > 函數式編程過程

函數式編程過程

發布時間:2024-12-08 13:44:06

A. 什麼是編程範式

編程範式(programming paradigm),指的是計算機編程的基本風格或典範模式。

如果每個程序員都在創造一個虛擬世界,那麼編程範式就是世界觀和方法論,他們被置於一種有意識的無意識的方式中。可以知道編程是解決問題,解決問題可以有多種觀點和想法,其中通用和有效的模式被總結為範式。

例如,編程中常用的「面向對象編程」是一種範式。由於焦點和思維方式的不同,相對的範式自然有其自身的聚焦和傾向,因此一些範式常被用來描述「oriented」。

(1)函數式編程過程擴展閱讀:

主要的編程範式有三種:命令式編程,聲明式編程和函數式編程。

1、命令式編程:

命令式編程的主要思想是關注計算機執行的步驟,即一步一步告訴計算機先做什麼再做什麼。

2、聲明式編程:

聲明式編程是以數據結構的形式來表達程序執行的邏輯。它的主要思想是告訴計算機應該做什麼,但不指定具體要怎麼做。SQL 語句就是最明顯的一種聲明式編程的例子。

3、函數式編程:

函數式編程和聲明式編程是有所關聯的,因為他們思想是一致的:即只關注做什麼而不是怎麼做。但函數式編程不僅僅局限於聲明式編程。

函數式編程最重要的特點是「函數第一位」,即函數可以出現在任何地方,比如可以把函數作為參數傳遞給另一個函數,不僅如此你還可以將函數作為返回值。

參考資料來源:網路-多重編程範式

B. 前端必學-函數式編程(六)

我們前篇談了很多關於【閉包】的理解了,所以你應該會知道,我們現在將要談的就是 ——【非同步】。

我們為什麼覺得「非同步問題」復雜呢?

其中很重要的一個原因是 —— 時間!時間將我們對數據的操判運作、管理,變復雜了好幾個量級!

(需要特別提出並明確的是: 非同步和同步之間是可以相互轉化的! 我們使用非同步或者同步取決於 —— 如何使代碼更加可讀!)

函數式編程給出了實現「代碼更可讀」的落地原則(已多次回顧):

所以我們可以期待,非同步在函數式編程中的表現!

上代碼:

onCustomer(..) 和 onOrders(..) 是兩個【回調函數】釋義,兩者執行的先後順序並不能確定,所以它是一個基於時間掘喚梁的復雜狀態。

釋義:回調函數其實就是一個參數,將這個函數作為參數傳到另一個函數裡面,當那個函數執行完之後,再執行傳進去的這個函數。

通常來說,我們最先想到的是:把 lookupOrders(..) 寫到 onCustomer(..) 裡面,那我們就可以確認 onOrders(..) 會在 onCustomer(..) 之後運行。

這樣寫,對嗎?

不對!因為 onCustomer(..) 、 onOrders(..) 這兩個回調函數的關系更像是一種競爭關系(都是賦值 customer.orders ), 它們應該並行執行 而不是串列執行

即:我不管你們誰先執行,誰先執行完,誰就賦值給 customer.orders !

那我們的思路應該是:

不過,這樣讓代碼又變得更加難閱讀!!函數內部賦值依賴於外部變數、甚至受外部回調函數的影響。

那究竟怎麼辦呢?

最終,我們借用 JS promise 減少這個時間狀態,將非同步轉成同步:

兩個 .then(..) 運行之前, lookupCustomer(..) 和 lookupOrders(..) 已被同步調用,滿足並行執行,誰先結束,誰賦值給 customer.orders ,所以我們不需要知道誰先誰後!

在這樣的實現下,不再需要時間先後的概念!減少了時間狀態!!代碼的可讀性更高了!!

這是一個 積極的數組 ,因為它們同步(即時)地操作著離散的即時值或值的列表/結構上的值。

什麼意思?

a 映射到 b,再去修改 a ,b 不會收到影響。

而這,是一個 惰性的數組 , mapLazy(..) 本質上 「監聽」 了數組 a,只要一個新的值添加到數組的末端(push(..)),它都會運行映射函數 v => v * 2 並把改變後的值添加到數組 b 里。

什麼意思?

a 映射到 b,再去修改 a ,b 也會修改。

原來,後者存在 非同步 的概念。

讓我們來想像這樣一個鏈櫻數組,它不只是簡單地獲得值,它還是一個懶惰地接受和響應(也就是「反應」)值的數組,比如:

設置「懶惰的數組」 a 的過程是非同步的!

b ,是 map 映射後的數組,但更重要的是,b 是 反應性 的,我們對 b 加了一個類似監聽器的東西。

這里直接給出解答:

這里再多小結一句:時間讓非同步更加復雜,函數式編程在非同步下的運用就是減少或直接幹掉時間狀態。

想像下 a 還可以被綁定上一些其他的事件上,比如說用戶的滑鼠點擊事件和鍵盤按鍵事件,服務端來的 websocket 消息等。

上述的 LazyArray 又可叫做 observable !(當然,它不止用在 map 方法中)

現在已經有各種各樣的 Observables 的庫類,最出名的是 RxJS Most

以 RxJS 為例:

不僅如此,RxJS 還定義了超過 100 個可以在有新值添加時才觸發的方法。就像數組一樣。每個 Observable 的方法都會返回一個新的 Observable,意味著他們是鏈式的。如果一個方法被調用,則它的返回值應該由輸入的 Observable 去返回,然後觸發到輸出的 Observable里,否則拋棄。

比如:

本篇介紹了【非同步】在函數式編程中的表現。

原則是:對於那些非同步中有時態的操作,基礎的函數式編程原理就是將它們變為無時態的應用。即 減少時間狀態

就像 promise 創建了一個單一的未來值,我們可以創建一個積極的列表的值來代替像惰性的observable(事件)流的值。

我們介紹了 RxJS 庫,後續我們還會介紹更多優美的 JS 函數式編程庫!

(俗話說的好,三方庫選的好,下班都很早!!)

現在本瓜有點明白那句話了:看一門語言是不是函數式編程,取決於它的核心庫是不是函數式編程。

也許我們還不熟悉像 RxJS 這類庫,但我們慢慢就會越來越重視它們,越來越使用它們,越來越領會到它們!!

非同步,以上。

閱讀全文

與函數式編程過程相關的資料

熱點內容
編譯器用數學嗎 瀏覽:5
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:735
arj壓縮與解壓批處理怎麼寫 瀏覽:658
php和大數據哪個好 瀏覽:930
未來最值得投資的加密貨幣 瀏覽:526
ascii碼是編譯的時候用嗎 瀏覽:781
壓縮機感應包可以通用嗎 瀏覽:412
方舟伺服器怎麼發布到搜索列表 瀏覽:270
xml防反編譯 瀏覽:241
數據傳輸加密系統技術方案 瀏覽:842
程序員沒有準備去面試 瀏覽:4
51單片機usb滑鼠 瀏覽:881
qq伺服器的ip地址查詢 瀏覽:112
java仿qq聊天 瀏覽:401
解壓的ipa重新打包 瀏覽:144
程序員那麼可愛vip版 瀏覽:241
程序員怎麼升職 瀏覽:245
圖形化命令按鈕vb 瀏覽:987
vcu盤加密怎麼設置 瀏覽:415