部分申請

讓我們澄清初學者可能會犯的一些誤解。

你可能遇到過以下功能:

max :: (Ord a) => a -> a -> a  
max m n  
  | m >= n = m  
  | otherwise = n  

初學者通常將 max :: (Ord a) => a -> a -> a 視為具有 a 型別的兩個引數(值)的函式,並返回 a 型別的值。然而,真正發生的是,max 正在採用 a 型別的一個引數返回 a -> a 型別的函式。然後該函式接受 a 型別的引數並返回 a 型別的最終值。

實際上,max 可以寫成 max :: (Ord a) => a -> (a -> a)

考慮 max 的型別簽名:

Prelude> :t max  
max::Ord a => a -> a -> a  

Prelude> :t (max 75)  
(max 75) :: (Num a, Ord a) => a -> a  

Prelude> :t (max "Fury Road")  
(max "Fury Road") :: [Char] -> [Char]  

Prelude> :t (max "Fury Road" "Furiosa")  
(max "Fury Road" "Furiosa") :: [Char]  

max 75max "Fury Road" 可能看起來不像功能,但實際上,它們是。

混淆源於這樣一個事實:在數學和許多其他常見的程式語言中,我們被允許具有多個引數的函式。但是,在 Haskell 中,**函式只能接受一個引數,**並且它們可以返回諸如 a 之類的值,或者諸如 a -> a 之類的函式。