簡體   English   中英

函數式編程和強類型化之間是否有任何聯系?

[英]Is there any link between functional programming and strong typing?

所有“純”功能語言都是強類型。 兩者之間有聯系嗎?

非平凡的函數式編程技術大量使用了一流的和高階的函數。 一流的功能實現為閉包。 僅當您進行垃圾回收時,才可輕松使用一流的函數和閉包。 高效可靠的垃圾回收需要內存安全性(我認為您的意思是“強類型”)。 所以你去了。

純度並不重要。

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

在減少運行時故障並在不進行類型強制的情況下使編程更安全地增加純凈度(例如,運行時故障仍然是一種選擇)的情況下,分別發出發布有類型的純函數式編程的社區是矛盾的。

因此,您不會意外地看到類型和效果類型與默認純度一起使用:這全都在於減少運行時故障。

Mercury(您可以在其中進行函數式編程,但更像是一種純邏輯編程語言)實際上具有顯式的靜態純度系統。 每個謂詞或函數在靜態上都是純凈的或不純凈的(或半純凈的,但我將不做詳細介紹)。 在純函數(默認是純函數)中放置對不純函數的調用將導致在編譯時檢測到錯誤。

它還具有一個靜態類型系統,其中每個表達式/變量的類型都由編譯器靜態地知道,並且在編譯時檢測到類型錯誤。 但是類型系統完全獨立於純度系統(因為您可以具有任何給定類型的純,不純和半純功能)。

因此,我們可以想象具有相同靜態純度系統的另一種語言,但是其中的表達式/變量的類型不是靜態已知的,並且在運行時可能會動態變化。 甚至可以想象這樣一種在PHP的意義上具有“弱類型”的語言(即該語言將嘗試轉換值,以便實際上可以執行對值的類型沒有意義的操作),或者在某種意義上C(即,您可以說服該語言將一種類型的值存儲在該語言將視為另一種類型的變量中)。

還可以想象一種語言,其中純度不是靜態已知的,但仍在運行時強制執行。 該語言必須做一些事情,例如跟蹤它是否在純調用中,如果是,則拒絕對不純原始操作的調用。

因此,從這個意義上講,強類型和純編程之間沒有聯系。

但是,實際上強制執行純凈的語言(而不是像Scala那樣僅鼓勵純凈)傳統上是通過靜態分析實現的。 確實,純代碼的動機之一是它比以任意方式不純的代碼更容易受到靜態分析的影響。 一個人為的例子是,如果一個函數采用布爾型參數並返回某些值,則該函數可以返回最多兩個結果之一(如果它是純函數)。 如果不知道它是純凈的,則該語言必須假定它在每次調用時可能返回不同的結果。如果您對代碼進行靜態分析感興趣,並且擁有用於執行純凈度的靜態分析系統,則您可以也可能使其強制執行類型安全。 因此,對於那些要求純凈但沒有強大的靜態類型系統的語言而言,“呼吁並不多”。 我不知道實際上有什么存在(據我所知,並沒有那么多的語言可以完全實現純潔)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM