1

所有「純」功能語言都是強類型的。那些之間有任何聯繫嗎?函數式編程和強打字之間是否有聯繫?

+1

功能程序員的肌肉手指,而不是命令式和動態程序員的弱手指:) –

+0

您將不得不定義「純」。 –

+1

所以你現在已經有了一個純粹的功能動態編程語言:http://code.google.com/p/pure-lang/ – pyfunc

回答

1

水星(在其中你可以做功能編程,但更多的是純邏輯編程語言)實際上有一個明確的靜態純度系統。每個謂詞或函數都被靜態地稱爲純粹的或不純的(或半精簡的,但我不打算詳細討論)。在純函數內部調用不純函數(純粹是默認函數)會導致在編譯時檢測到錯誤。

它也有一個靜態類型系統,其中每個表達式/變量的類型是編譯器靜態知道的,並且在編譯時檢測到類型錯誤。但類型系統完全獨立於純度系統(因爲您可以擁有任何給定類型的純粹,不純和半精簡函數)。

因此,我們可以想象一種具有相同靜態純度系統的不同語言,但表達式/變量類型不是靜態已知的,並且可能在運行時動態變化。人們甚至可以想象這種語言在PHP的意義上具有「弱類型」(即,語言會嘗試轉換值,使得對於該類型的值沒有意義的操作實際上可以執行),或者從C(也就是說,你可以說服語言把一種類型的值存儲在一個變量中,語言將把它看作是一種不同的類型)。

人們也可以想象一種語言,其中的純度不是靜態的,但仍然在運行時執行。語言必須做一些事情,例如跟蹤它是否處於純粹的調用中,如果是這樣,則拒絕調用不純的基本操作。

所以從這個意義上說,強類型和純編程之間沒有聯繫。

然而,實際上強化純度(而不是像Scala中那樣鼓勵它)的語言傳統上是通過靜態分析實現的。事實上,純代碼的動機之一是它比靜態分析更容易受到任何方式不純的代碼的影響。一個人爲的例子是,一個函數接受一個布爾型參數並返回一些東西,如果它是純的,那麼可以返回至多兩個結果中的一個;如果它是不知道是純粹的,那麼語言必須假定它可能在每次調用時返回不同的東西。如果你有興趣對你的代碼進行靜態分析,並且你有這個靜態分析系統來執行純度,那麼你也可以使它強制執行類型安全。所以對強制純粹但沒有強大的靜態類型系統的語言來說,「沒有那麼多要求」。我不知道有任何實際存在的東西(據我所知,並不是所有這些語言都強制執行純度)。

2

非平凡的函數式編程技術大量使用一級和更高階的函數。一流的功能被實施爲關閉。一級函數和閉包的非平凡使用只有在您有垃圾收集時纔有用。高效和可靠的垃圾收集需要記憶安全(我認爲你的意思是「強類型」)。所以你去了。

純度並不重要。

2

「純」功能語言是強制引用透明的語言。執行可以是靜態的(通過類型系統),也可以是動態的(例如運行時故障)。我猜你的意思是「靜態類型」,當你說「強類型」... ...

Sincbe社區從哪個類型,純功能編程涌現出來分別發佈在減少運行時失敗和編程更安全無需添加純度執行 - 即使運行時失敗仍然是一種選擇 - 是不協調的。

因此,您不會驚訝地發現類型和效果類型與默認純度結合在一起:這完全是爲了減少運行時失敗。

相關問題