2016-05-04 76 views
0
map :: (a -> b) -> [a] -> [b] 
map f xs = [f x | x <- xs] 

此定義來自Haskell by Hutton編程(第62頁)。在它的類型Haskell映射函數類型的詳細信息

看,我瞭解的功能是如何發生是一個函數,第二個參數是一個列表的第一個參數。

但確實上述類型變得(a -> b) -> ([a] -> [b])?這樣的地圖需要的功能,並返回一個函數,它[a]並返回[f x|x <- xs]?

,爲什麼它(a -> b) -> [a] -> [b],而不是(a -> a) -> [a] -> [a] ?

例如,書中使用map(+1)[1,3,5,7]

有人能請詳細解釋這個功能呢?

+2

'A - > B'並不意味着兩種*必須*是不同的,只是他們可以* *是不同的。 – chepner

回答

5

函數返回值可以是任何其它類型,有關字符串例如長度。記號

(a -> b) -> [a] -> [b] 

相當於

(a -> b) -> ([a] -> [b]) 

一般

a -> b -> c -> d 

相當於

a -> (b -> (c -> d)) 

你的函數(+1)恰好是Num a => a -> a一個特例。

0

提示: 你應該知道該函數的類型遵循鑽營法律,所以是正確的關聯。這就是爲什麼我們避免或刪除類型中的括號。

在另一方面你在函數([A],[B])指的是你要使用不同類型的輸入或輸出,其中正是他們出現的類型使用不同的字母。