Cadenas opuestas
La opuesta de una cadena de letras es la cadena obtenida cambiando las minúsculas por mayúsculas y las minúsculas por mayúsculas. Por ejemplo, la opuesta de «SeViLLa» es «sEvIllA».
Definir la función
| 1 |    esOpuesta :: String -> String -> Bool | 
tal que (esOpuesta s1 s2) se verifica si las cadenas de letras s1 y s2 son opuestas. Por ejemplo,
| 1 2 3 4 5 6 |    esOpuesta "ab" "AB"      `== True    esOpuesta "aB" "Ab"      `== True    esOpuesta "aBcd" "AbCD"  `== True    esOpuesta "aBcde" "AbCD" `== False    esOpuesta "AB" "Ab"      `== False    esOpuesta "" ""          `== True | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import Data.Char (isLower, isUpper, ord, toLower, toUpper) -- 1ª solución (por comprensión) -- ============================= esOpuesta1 :: String -> String -> Bool esOpuesta1 s1 s2 = [opuesto c | c <- s1] == s2 opuesto :: Char -> Char opuesto c   | isLower c = toUpper c   | otherwise = toLower c -- 2ª solución (con map) -- ===================== esOpuesta2 :: String -> String -> Bool esOpuesta2 s1 s2 = map opuesto s1 == s2 -- 3ª solución (por recursión) -- =========================== esOpuesta3 :: String -> String -> Bool esOpuesta3 "" ""           = True esOpuesta3 (c1:s1) (c2:s2) = esOpuesto c1 c2 && esOpuesta3 s1 s2 esOpuesta3 _ _             = False esOpuesto :: Char -> Char -> Bool esOpuesto c1 c2 = abs (ord c1 - ord c2) == 32 |