2017-08-17 115 views
0

我試圖理解表達式(map . map)的類型。由於(.)的類型是(b -> c) -> (a -> b) -> a -> c我不明白這是如何與地圖功能一起使用的,因爲地圖有兩個參數不適合(b -> c)(a -> b)類型(地圖。地圖)

+8

注意,'甲 - >乙 - > C'是短期的'一個 - >(B - > C)'。在Haskell中,所有函數都只有*一個*參數。 –

+2

我在想那個。但我不能決定它應該分成'a - >(b - > c)'還是'(a - > b) - > c'。但是你現在說的話對我來說很有意義。如果我這樣想:如果我們想把map看作一個「單參數函數」,它的類型是「(a - > b) - >([a] - > [b])」 ,因爲如果我們爲它提供第一個參數('(a - > b)'函數),我們得到的是類型'([a] - > [b])'的函數'。因此,類型'(a - > b)'和'([a] - > [b])'對應於'(a - > b)'中的'a'和'b', 。map)'? – Nicrophorus

+3

'a - > b - > c'與'a - >(b - > c)'相同,但不同於'(a - > b) - > c' – user3927886

回答

5

報價GHCI:

Prelude> :t map.map 
map.map :: (a -> b) -> [[a]] -> [[b]] 

但對於地圖本身,類型是

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

,你可以作爲

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

所以你們看到,如果我們有 (.) :: (t2 -> t3) -> (t1 -> t2) -> t1 -> t3

然後:

  • t1(a -> b)
  • t2([a] -> [b])
  • t3是我喜歡把它([[a]] -> [[b]])
1

一種方式是map變成一個a -> b[a] -> [b],所以map . map做了兩次。第一張地圖將您的a -> b變成[a] -> [b],第二張地圖將重複該過程,將其變爲[[a]] -> [[b]]

「應用mapa -> b把它變成一個[a] -> [b]」,因此,它似乎很漂亮合乎邏輯的應用map[a] -> [b]會變成一個[[a]] -> [[b]]。您只需將map應用於一個函數兩次。

順便提及:

-- apply map to a function once 
      map :: (a -> b) -> ( [a] -> [b] ) 
-- apply map to a function twice 
     map . map :: (a -> b) -> ([[a]] -> [[b]]) 
-- apply map to a function three times 
map . map . map :: (a -> b) -> ([[[a]]] -> [[[b]]])