2012-01-04 24 views
16

Sigo siendo un principiante de Haskell. ¿Puedo hacer un doble mapa en haskell?¿Doble mapa en haskell?

Por ejemplo, si tengo una [[Char]] y quiero convertir cada Char en cada [Char] a minúsculas, ¿hay una manera fácil de hacer esto en lugar de algo como:

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

Yo: "¿Puede @faq Haskell hacer un mapa doble? " Lambdabot: "La respuesta es: ¡sí! ¡Haskell puede hacer eso!" :) –

+0

Es útil tener en cuenta que el mapa en sí está definido en el Preludio "cola recursivamente" con la misma estructura que esta cortada ... básicamente, ¡implementó el mapa sin siquiera saberlo! ;) En cuanto a la semántica de Haskell, su forma de entender y la respuesta aceptada "hacen" lo mismo (lo mismo EXACTO, creo), se escriben de manera diferente. Sin embargo, decir "mapa del mapa" definitivamente es mucho más elegante. –

Respuesta

21

Se puede pensar map f, como la transformación de una función f :: a -> b en una función en las listas map f :: [a] -> [b], por lo que si desea transformarlo aún más en una función en listas de listas, solo necesita usar map nuevamente para obtener map (map f) :: [[a]] -> [[b]].

En este caso en particular, que se convierte en:

exampleF = map (map toLower) 
+3

'exampleF xss = map (\ xs -> map toLower xs) xss' - una forma alternativa de escribirlo si te hace sentir mejor. Sin embargo, se fomenta la forma en que hammar lo escribió (ya que es eta reducido y, de hecho, punto libre). Te acostumbrarás, si aún no lo estás. –

21

De hecho, no es un buen patrón aquí:

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

y así sucesivamente

+0

más general: '(fmap. Fmap) :: (Functor m, Functor n) => (a -> b) -> m (n a) -> m (n b)' –