在Haskell中,函數的類型告訴你它到底做了什麼,更重要的是,它沒有做什麼。這使得更容易推理Haskell代碼。
舉例來說,如果我有以下類型的函數:
f :: Int -> Int
我知道,它需要一個Int
作爲輸入,併產生一個Int
作爲輸出,它也沒有別的。重要的是,我知道它沒有副作用。
如果我有類型的函數:
g :: Double -> State Int Double
...該功能需要一個Double
作爲參數,併產生辦法產生Double
,但只有當我允許它協商或修改一些Int
狀態。
如果我有類型的函數:
h :: Int -> Maybe String
我知道,這個功能需要一個Int
,並可能產生String
,也可能會失敗,生產什麼。請注意,前兩個函數都沒有返回Maybe
,這意味着它們不會失敗。 Haskell默認不允許失敗(即可爲空值)。
如果我有類型的函數:
i :: String -> IO()
我知道,這個功能需要一個String
並且可以運行產生副作用。請注意,以前的函數都沒有IO
的類型,這意味着它們不會產生副作用。 Haskell默認不允許副作用。你必須明確地加入他們的類型。
這意味着我們可以查看函數或值的類型,並立即瞭解它們正在使用的功能。因此,例如,如果我看到類型爲Maybe
,我知道可能會失敗,如果我不這樣做,那麼我知道沒有可能失敗。同樣,如果我在該類型中看到IO
,則我知道存在潛在的副作用,但如果我在該類型中看不到IO
,則不存在副作用的可能性。
在主流語言中,您不具備選擇性「選擇」功能的能力。所有功能默認情況下始終處於打開狀態,這意味着您必須始終檢查null
,因爲您無法保證某些功能沒有失敗,並且您必須始終運行測試,因爲您無法保證某些功能並沒有暗示修改你係統的狀態。
Haskell允許您限制函數的行爲,使您可以更細緻地控制其「權限」,這樣可以更輕鬆地擴展到大型程序而無需使用錯誤,還可以更輕鬆地閱讀和理解Haskell代碼,因爲類型枚舉代碼行爲的全部範圍,所以你永遠不必理解類型允許的更多內容。
不要浪費你的時間與可愛的寓言描述的數學概念,如monads。研究實際的數學。 – 2013-02-25 14:13:50