讓一個類型表示一個函數有什麼好處?使用類型來表示函數有什麼好處?
例如,我觀察到下面的代碼片段:
type Soldier = Soldier of PieceProperties
type King = King of PieceProperties
type Crown = Soldier -> King
難道只是支持部分應用程序時,額外的參數還沒有被滿足?
讓一個類型表示一個函數有什麼好處?使用類型來表示函數有什麼好處?
例如,我觀察到下面的代碼片段:
type Soldier = Soldier of PieceProperties
type King = King of PieceProperties
type Crown = Soldier -> King
難道只是支持部分應用程序時,額外的參數還沒有被滿足?
正如陀Soikin說,在評論
你給名稱一切同樣的原因 - 值,函數, 模塊等
換句話說,想想彙編編程通常不使用類型(是的,我知道typed assembly)以及所有可能存在的問題,然後通過添加類型可以解決或減少多少這些問題。
因此,在使用支持函數但使用靜態類型的語言進行編程之前,您鍵入了所有內容。現在您正在使用具有靜態類型和函數的F#,只需擴展您使用的鍵入的鍵值,但現在可以添加輸入函數的功能。
要從"Types and Programming Languages"
引述本傑明C.皮爾斯A型系統是用於通過根據 種值的它們計算的短語進行分類證明某些程序行爲的不存在 易處理句法的方法。
正如指出的 「類型和編程語言」 第1.2節
什麼類型的系統有利於
- 檢測錯誤
- 抽象
- 文檔
- 語言安全
- 效率
TL; DR
一,我發現一個名爲類型的函數定義寶貴的地方是,當我建立解析器組合。在構建函數的過程中,我完全鍵入函數,以便知道類型是什麼,而不是類型推理會推斷出它們可能與我想要的不同。由於函數類型通常具有多個參數,因此只需給函數類型一個名稱即可,然後在需要的地方隨即使用該名稱。這也節省了時間,因爲函數定義是一致的並且避免必須調試不適當聲明的函數定義;是的,我通過手工操作每種功能類型而犯了錯誤,並吸取了教訓。一旦所有函數都起作用,然後我從函數中刪除類型定義,但將類型定義保留爲註釋,以使代碼更易於理解。
使用指定類型定義的一個好處是,在創建測試用例時,指定函數中的輸入規則將確保用於測試的數據是正確的類型。這也使得在數月後回到測試數據時,理解測試數據變得更容易理解。
另一個優點是使用函數名稱會使代碼更易於理解,因爲當新的代碼人員第一次查看他們是否可以發現名稱的一致性時。此外,如果名稱有意義,那麼它使得理解代碼變得更容易。
您必須記住,函數也是F#中的值。你可以像其他類型那樣做很多相同的事情。例如,你可以有一個返回其他函數的函數。或者你可以有一個存儲功能的列表。在這些情況下,如果您明確瞭解函數簽名,將會有所幫助。函數類型定義將幫助您限制參數和返回類型。另外,你可能有一個複雜的類型簽名,類型定義會使它更具可讀性。這也許有點做作,但你可以做樂趣(KY)這樣的東西:
type FuncX = int -> int
type FuncZ = float -> float -> float
let addxy (x:int) :FuncX = (+) x
let subxy :FuncX = (-) x
let addz (x:float) :FuncZ =
fun (x:float) -> (fun y -> x + y)
let listofFunc = [addxy 10;addxy 20; subxy 10]
如果您檢查listofFunc的類型,你會看到它的FuncX list
。 :FuncX
也指函數的返回類型。但是我們也可以使用它作爲輸入類型:
let compFunc (x:FuncX) (z:FuncX) =
[(x 10);(z 10)]
compFunc (addxy 10) (addxy 20)
同樣的原因你給別的名字 - 值,函數,模塊等等 –