首页 > 解决方案 > 地图地图与地图地图

问题描述

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

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

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

这些函数在语法方面有何不同,它们各自的确切含义是什么?

标签: functionhaskellfunctional-programming

解决方案


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

map :: (  a     ->      b     ) -> ([a] -> [b])
map :: (c -> d) -> ([c] -> [d])
-----------------------------------------------
a ~ (c -> d), b ~ [c] -> [d]

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

map map :: [a] -> [b]
        :: [c -> d] -> [[c] -> [d]]

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

因此,这意味着如果你写:

(map map) [(+1), (*2), (-3)]

你检索到类似的东西:

[map (+1), map (*2), map (-3)]

情况并非如此map . map。这个表达式等价于(.) map map。该(.) :: (b -> c) -> (a -> b) -> a -> c函数接受两个函数fg,并将它们组合为\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

的类型(.) map map是这样的:

(.) map map :: a -> c
            :: (f -> g) -> ([d] -> [e])
            :: (f -> g) -> ([[f]] -> [[g]])

该函数接受一个类型f -> g为 的函数,并将生成一个函数,该函数接受一个fs 列表的列表,并且它可以将这些映射到gs。

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

(map . map) (+1) [[1,4,2,5],[1,3,0,2]]

它将生成:

[[2,5,3,6], [2,4,1,3]]

推荐阅读