地图map vs map.map

Sav*_*emp 4 haskell functional-programming function

我是Haskell的新手,我认为Haskell中的功能map map和map.map相同。我的终端机给我两种不同的类型,

(map.map) :: (a -> b) ->  [[a]]  ->  [[b]]
Run Code Online (Sandbox Code Playgroud)

和

(map map) :: [a -> b] -> [[a] -> [b]]
Run Code Online (Sandbox Code Playgroud)

这些功能在语法方面有什么不同?每个功能的确切含义是什么?

Wil*_*sem 8

该map map表达式将第二个map作为第一个的参数。因此,这意味着如果我们派生类型,我们将看到:

map :: (  a     ->      b     ) -> ([a] -> [b])
map :: (c -> d) -> ([c] -> [d])
-----------------------------------------------
a ~ (c -> d), b ~ [c] -> [d]
Run Code Online (Sandbox Code Playgroud)

因此,这意味着与a具有相同的类型c -> d,并且与b具有相同的类型[c] -> [d]。因此,这意味着的类型map map是:

map map :: [a] -> [b]
        :: [c -> d] -> [[c] -> [d]]
Run Code Online (Sandbox Code Playgroud)

map map因此,此处将类型为的功能列表作为参数c -> d,并将生成执行与这些功能的映射的功能列表。

因此,这意味着如果您编写:

(map map) [(+1), (*2), (-3)]
Run Code Online (Sandbox Code Playgroud)

您检索类似:

[map (+1), map (*2), map (-3)]
Run Code Online (Sandbox Code Playgroud)

情况并非如此map . map。此表达式等效于(.) map map。该(.) :: (b -> c) -> (a -> b) -> a -> c函数有两个函数f和g,并结合这些作为\x -> f (g x)。因此,该类型表示:

(.) :: (  b     ->      c     ) -> ((  a     ->      b     ) -> (a -> c))
map :: (d -> e) -> ([d] -> [e])
map ::                              (f -> g) -> ([f] -> [g])
-------------------------------------------------------------------------
b ~ d -> e ~ [f] -> [g], c ~ [d] -> [e], a ~ f -> g, d ~ f, e ~ g
Run Code Online (Sandbox Code Playgroud)

因此,类型(.) map map为:

(.) map map :: a -> c
            :: (f -> g) -> ([d] -> [e])
            :: (f -> g) -> ([[f]] -> [[g]])
Run Code Online (Sandbox Code Playgroud)

此函数采用type的单个函数f -> g,并将生成一个采用fs 列表列表的函数,并且可以将这些列表映射到gs。

因此(map . map) (+1)将生成一个函数,用于:

(map . map) (+1) [[1,4,2,5],[1,3,0,2]]
Run Code Online (Sandbox Code Playgroud)

它将产生:

[[2,5,3,6], [2,4,1,3]]
Run Code Online (Sandbox Code Playgroud)