Haskell 哈斯克尔的双重地图?

Haskell 哈斯克尔的双重地图?,haskell,mapping,Haskell,Mapping,我还是哈斯克尔的初学者。我能在haskell做一张双人地图吗 例如,如果我有一个[[Char]],并且我想将每个[Char]中的每个字符都转换为小写,那么有没有一种简单的方法来实现这一点,而不是类似于: exampleF [] = [] exampleF (x:xs) = (map toLower x) : exampleF xs 您可以将map f看作是将函数f::a->b转换为列表上的函数map f::[a]->[b],因此如果您想将其进一步转换为列表列表上的函数,只需再次使用map即可获

我还是哈斯克尔的初学者。我能在haskell做一张双人地图吗

例如,如果我有一个
[[Char]]
,并且我想将每个
[Char]
中的每个
字符都转换为小写,那么有没有一种简单的方法来实现这一点,而不是类似于:

exampleF [] = []
exampleF (x:xs) = (map toLower x) : exampleF xs

您可以将
map f
看作是将函数
f::a->b
转换为列表上的函数
map f::[a]->[b]
,因此如果您想将其进一步转换为列表列表上的函数,只需再次使用
map
即可获得
map(map f):[[a]->[b]

在这种特殊情况下,即:

exampleF = map (map toLower)

事实上,这里有一个很好的模式:

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

以此类推

examplefxss=map(\xs->map-toLower-xs)xss
——如果它让您感觉更好的话,这是另一种编写方法。然而,哈马尔写这篇文章的方式是值得鼓励的(因为它减少了eta,而且事实上是零分的)。如果你还没有习惯的话,你会习惯的。我:“@faq haskell可以做一个双重映射吗?”Lambdabot:“答案是:是的!haskell可以做到!”:)需要注意的是,映射本身是在前奏曲“tail recursive”中定义的,其结构与此片段相同。。。基本上,您在不知道的情况下实现了map!;)就Haskell语义而言,您的方式和公认的答案“做”相同的事情(我认为完全相同的事情),它们只是写得不同而已。然而,说“映射映射”肯定要优雅得多。更一般的:
(fmap.fmap)::(函子m,函子n)=>(a->b)->m(na)->m(nb)