程式設計正規化19 函式正規化與Scheme

2021-08-08 13:57:24 字數 1793 閱讀 8313

過程 c

oo c++

函式正規化是面向函式返回值的

參考 參考

函式式程式設計與命令式程式設計最大的不同其實在於:函式式程式設計關心資料的對映,命令式程式設計關心解決問題的步驟這裡的對映就是數學上「函式」的概念——一種東西和另一種東西之間的對應關係。這也是為什麼「函式式程式設計」叫做「函式」式程式設計。這是什麼意思呢?假如,現在你來到 google 面試,面試官讓你把二叉樹映象反轉一下(大霧幾乎不假思索的,就可以寫出這樣的 python **:

def

inverttree

(root):

if root is

none:

return

none

if root.left:

inverttree(root.left)

if root.right:

inverttree(root.right)

root.left, root.right = root.right, root.left

return root

好了,現在停下來看看這段**究竟代表著什麼——它的含義是:首先判斷節點是否為空;然後翻轉左樹;然後翻轉右樹;最後左右互換。這就是命令式程式設計——你要做什麼事情,你得把達到目的的步驟詳細的描述出來,然後交給機器去執行。這也正是命令式程式設計的理論模型——圖靈機的特點。一條寫滿資料的紙帶,一條根據紙帶內容運動的機器,機器每動一步都需要紙帶上寫著如何達到。那麼,不用這種方式,如何翻轉二叉樹呢?函式式思維提供了另一種思維的途徑——所謂「翻轉二叉樹」,可以看做是要得到一顆和原來二叉樹對稱的新二叉樹。這顆新二叉樹的特點是每乙個節點都遞迴地和原樹相反。用 haskell **表達出來就是:

data

tree a = nil | node a (tree

a)(tree

a) deriving (show, eq)

invert :: tree a -> tree a

invert

nil = nil

invert (node v l r) = node v (invert r) (invert l)

(防止看不懂,翻譯成等價的 python )

def

invert

(node):

if node is

none:

return

none

else

return tree(node.value, invert(node.right), invert(node.left))

這段**體現的思維,就是舊樹到新樹的對映——對一顆二叉樹而言,它的映象樹就是左右節點遞迴映象的樹。這段**最終達到的目的同樣是翻轉二叉樹,但是它得到結果的方式和 python **有著本質的差別:通過描述乙個 舊樹->新樹 的對映,而不是描述「從舊樹得到新樹應該怎樣做」來達到目的。那麼這樣有什麼好處呢?首先,最直觀的角度來說,函式式風格的**可以寫得很精簡,大大減少了鍵盤的損耗(其次,函式式的**是「對對映的描述」,它不僅可以描述二叉樹這樣的資料結構之間的對應關係,任何能在計算機中體現的東西之間的對應關係都可以描述——比如函式和函式之間的對映(比如 functor);比如外部操作到 gui 之間的對映(就是現在前端熱炒的所謂 frp)。它的抽象程度可以很高,這就意味著函式式的**可以更方便的復用。另外還有其他答主提到的,可以方便的並行。同時,將**寫成這種樣子可以方便用數學的方法進行研究(不能理解 monad 就是自函子範疇上的乙個么半群你還想用 haskell 寫出 hello world ?)至於什麼科里化、什麼資料不可變,都只是外延體現而已。

正規化與反正規化

設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。但是有些時候一昧的追求正規化減少冗餘,反而會降低資料讀寫的效率,這個時候就要反正規化,利用空間來換時間。目前關聯式資料庫有六種正規化 第一正規化 ...

函式依賴與正規化

函式依賴與正規化 在資料庫設計過程中,往往遇到資料冗餘 修改異常 插入異常和刪除異常等問題,為了設計乙個好的資料庫,人們定義了一些好的關係模式標準,稱它們為規範的關係模式 簡稱正規化,nf 目前共定義了多個正規化,分別為1nf 2nf 3nf bcnf 4nf和5nf.但實際應用中,一般只要達到3n...

程式設計正規化 面向過程與函式式

一 面向過程 基於面向過程開發程式就好比在設計一條流水線,若程式一開始是要著手解決乙個大的問題,按照過程式的思路就是把這個大的問題分解成很多個小問題或子過程去實現,然後依次呼叫即可,這極大地降低了程式的複雜度。舉例如下 寫乙個資料遠端備份程式,分三步 本地資料打包,上傳至雲伺服器,檢測備份檔案可用性...