2016-07-31 61 views
1

讓一個類型表示一個函數有什麼好處?使用類型來表示函數有什麼好處?

例如,我觀察到下面的代碼片段:

type Soldier = Soldier of PieceProperties 
type King = King of PieceProperties 
type Crown = Soldier -> King 

難道只是支持部分應用程序時,額外的參數還沒有被滿足?

+6

同樣的原因你給別的名字 - 值,函數,模塊等等 –

回答

2

正如陀Soikin說,在評論

你給名稱一切

同樣的原因 - 值,函數, 模塊等

換句話說,想想彙編編程通常不使用類型(是的,我知道typed assembly)以及所有可能存在的問題,然後通過添加類型可以解決或減少多少這些問題。

因此,在使用支持函數但使用靜態類型的語言進行編程之前,您鍵入了所有內容。現在您正在使用具有靜態類型和函數的F#,只需擴展您使用的鍵入的鍵值,但現在可以添加輸入函數的功能。

要從"Types and Programming Languages"

引述本傑明C.皮爾斯A型系統是用於通過根據 種值的它們計算的短語進行分類證明某些程序行爲的不存在 易處理句法的方法。

正如指出的 「類型和編程語言」 第1.2節

什麼類型的系統有利於

  • 檢測錯誤
  • 抽象
  • 文檔
  • 語言安全
  • 效率

TL; DR

一,我發現一個名爲類型的函數定義寶貴的地方是,當我建立解析器組合。在構建函數的過程中,我完全鍵入函數,以便知道類型是什麼,而不是類型推理會推斷出它們可能與我想要的不同。由於函數類型通常具有多個參數,因此只需給函數類型一個名稱即可,然後在需要的地方隨即使用該名稱。這也節省了時間,因爲函數定義是一致的並且避免必須調試不適當聲明的函數定義;是的,我通過手工操作每種功能類型而犯了錯誤,並吸取了教訓。一旦所有函數都起作用,然後我從函數中刪除類型定義,但將類型定義保留爲註釋,以使代碼更易於理解。

使用指定類型定義的一個好處是,在創建測試用例時,指定函數中的輸入規則將確保用於測試的數據是正確的類型。這也使得在數月後回到測試數據時,理解測試數據變得更容易理解。

另一個優點是使用函數名稱會使代碼更易於理解,因爲當新的代碼人員第一次查看他們是否可以發現名稱的一致性時。此外,如果名稱有意義,那麼它使得理解代碼變得更容易。

1

您必須記住,函數也是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) 
相關問題