2010-07-10 64 views
3

我看this 9頻道的談話和一個非常有趣的說法是在周圍的60分鐘取得。模擬的副作用與線程

他說,即使是完全純函數,一旦你介紹線程可以模擬副作用。

他概述的方式是使用C-omega符號,這是我不熟悉的,這已經有相關的語言支持來做到這一點。

我遇到的問題是如何實現get和set消息處理程序而不分配?當然,處理程序必須更改一個值,以便線程的內部循環可以記錄一個新的值?

我錯過了什麼?例如,我如何在LISP中實現它,沒有特殊的構造?

+0

模擬副作用的目的是什麼?另外,C-Omega是微軟研究院的一個項目,現在已經不復存在。來自C-Omega的一些想法進入C#,其中一些沒有。 – 2010-07-10 17:48:05

+0

如果我正確理解「模擬副作用」,Haskell使用Monads來實現這一點,特別是IO Monad。 IO Monad允許純函數式編程,同時仍允許與外部世界進行交互(被認爲是一種副作用)。 – 2010-07-10 17:50:22

+0

@羅伯特 - 目的只是爲了證明在你的語言中沒有任何副作用,一旦你引入線程,你就沒有好處。 我的問題背後沒有實際的理由 - 這更多的是一個理論問題。 – 2010-07-10 17:58:47

回答

6

我遇到的問題是如何實現get和set消息處理程序而不分配?當然,處理程序必須更改一個值,以便線程的內部循環可以記錄一個新的值?

是的你是對的。 Erik假設每個線程都有自己的消息隊列。發送消息Value(n)明顯改變了消息隊列的狀態。他讓這聽起來更神祕:他只是交換另一種形式的可變狀態的任務。他利用語言的「先決條件」特徵使其在語法上變得乾淨。

正如他所說,你可以使用傳統的IO(他提到控制檯IO)做同樣的事情。假設Value(n)n寫入文件,前提條件Value(T t)檢查當前的狀態值是否爲t(在文件中)。 Voilà,沒有任務的可變狀態(但現在包含IO!)。

+1

我發現有趣的是,Eric從未在視頻中使用過「可變」或「不可變」等詞語,甚至沒有使用過。在描述功能純度時,他還設法避免了「封裝」這個詞,聲稱你只能是純粹或不純的,而不是兩者。是的,他確實比它更神祕。也許這是因爲他是一名學者。 – 2010-07-11 16:42:33