為什麼說函式式程式設計和命令式程式設計等價, 它們怎樣相互轉化

時間 2021-05-29 23:00:28

1樓:

時空是一體(本體)的統一的,函式式、命令式是一體(本體)的統一的。

圖1圖2

上面兩個圖是計算機裡的物件空間和物件的運動軌跡,這兩種有限集合圖可能是同乙個圖。被cpu執行緒驅動的主體物件沿著紅線行走,前乙個圖是主體觀察到的左手邊的世界,後乙個圖是主體觀察到的自己右手邊的世界。

一致的世界,所有地方都一致,明確無歧義。

圖3上圖有很多圓,圓裡面的圓(表集合、空間)稱作字段,圓外面的圓稱作函式(軌道路徑)。「內外」邊界(線、曲面)是物件空間的邊界線、邊界面。上圖使用圖形明確標出了什麼是物件?

比如兩個綠色箭頭指向的那兩個圓體就是物件。

b物件裡面的世界對於a物件來說在a物件的外面,所以b物件裡面的圓對於a來說不是a的字段而是a可能可以途經的軌道路徑。所以,b中如果有乙個A型別的字段的話,那麼a物件就可以運動到b的那個字段位置地去。什麼叫A型別B型別呢?

型別就是一串等長的01串。

也就是說,引入物件這樣的概念的意義是:幫助人們左右互看,左看看右看看,外看看內看看。從而和人的左右對齊過去,人也是有左右腦的。

圖4我想在上圖的紅線上打上01010101……,需要打的太多了,畫起來很困難,上圖紅線上都分布著01,雖然圖中有很多接觸著的圓,其實它們是一條線繞出來的,用個剪刀剪開個口然後一提溜就知道了,是一條線。

如果b物件中有一串和a物件等長的01串欄位空間的話就可以認為b物件中的這個欄位是A型別的(光度量長度還不夠,暫時忽略上層高維的另外的資訊,這裡就認為只度量長度就行了)。b中的這個欄位能裝下去a,所以a能運動到b中的這個字段位置去。

為什麼型別,比如int型別是圓形的?因為週期,因為減法是用加法完成的,型別一直都是圓形的鐘錶那樣的週期形的。

感覺如果照這種方法推下去,沒有它解釋不了的計算機世界。這種方法的優勢是它是圖形空間運動(集合、樹,對映、函式)形的。人的思維離開圖形空間後走不太遠。

看來字段(空間)和函式(規則、對映、運動定律)是相對的。當A型別中有乙個B型別的字段:對於A型別的物件來說它那個相對於它的字段所在的空間位置是字段,但是對於B型別的物件來說卻是可以行走過去途經上的路徑地點。

時空是一體(本體)的統一的,函式式、命令式是一體(本體)的統一的。

2樓:易文倫

前面張巨集波也說了,函式程式設計和命令式程式設計在計算模型上是圖靈等價的(邱奇-圖靈論題)。至於如何轉換的問題,我們可以使用指稱語義(denotational semantics)來幫助。簡單而言,在指稱語義裡,命令式程式可以視為乙個從狀態到狀態的數學函式。

乙個簡單的例子:

比如說,對於狀態State,我們可以定義State = Variables -> Values,那麼狀態State就是乙個變數到值的函式,而程式是由一系列的改變機器狀態的命令Command集合組成,Command可以視為是乙個狀態對映函式Command = State -> State.那麼,乙個簡單的賦值命令,就可以用乙個modify函式來定義:

modify(s, x, a) = λv E Variables, if v=x then a else s(v)

如果我們用函式C來給出命令程式P的定義,用表示式的方式,我們可以用[[P]]來表示P的語法樹,那麼:

C[[x := e]] = modify(s, x E[[e]] (s))

C[[P1;P2]] = C[[P2]] (C[[P1]](s))

C[[if e then P1 else P2]](s) = if E[[e]](s) then C[[P1]](s) else C[[P2]](s)

C[[while e do P]] = if not E[[e]](s) then s else C[[while e do P]](C[[P]](s))

這個例子來自John C. Mitchell的Concepts in Programming Languages一書。

3樓:李遙

先不說圖靈等價什麼的,函式式程式語言Lisp、Haskell、Erlang等,甚至很多非函式式的語言如Prolog、Make等*本質上*不過是個規則語言,最後靠規則引擎eval()來執行規則。

任何人隨時都可以設計乙個規則語言玩玩,沒有什麼特別的。

說到轉換,只要考察一種語言執行過程中造成的資料流的動態行為就行了,然後用逆向方式用另一種語言還原出來即可

為什麼會有函式式程式設計?

Jason Hu 這個問題就是跟問 為什麼會有數學,數學是為了解決什麼問題 是乙個意思。基於lambda calculus的語言比基於TM的語言具有更數學含義。實際上,任一形式邏輯系統都對應一種函式式語言。相反,基於TM的語言自成一系,並無法繼承數學和邏輯系統裡的知識架構。另外,基於TM的程式語義也...

模板元程式設計和泛函程式設計都是函式式程式設計嗎?

夏梓耀 不會C 模板元,但是你的問題其實相當於在問什麼是functional programming?FP並沒有明確的定義,只能通過個人 淺顯的 理解來回答了 函式式程式設計是指一種程式設計正規化,其first class value是函式,並有如下properties 1.因為函式為first c...

函式式程式設計immutable data是不是本質上效能就差點?

個人認為是的,而且開發起來好像也更加麻煩,如果要更新值,那麼完了還要把原來的 replace 掉,甚至要把所有有關聯的地方都要做一次 update.意義是什麼?就為了乙個所謂的無隱患 copy 如果說的不對,還希望大家指出正確使用方式。 navegador 它不一定就得真正的去 malloc.只要在...