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)
这些功能在语法方面有什么不同?每个功能的确切含义是什么?
该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)