Вы должны использовать concat
по вашему результату или использовать concatMap
вместо map
. В конце концов, вы возвращаете списки на своей карте и, следовательно, получаете список списков.
Дадим ваша функция имя и тип:
magic :: [([Char], [Char])] -> [(Char, Char)]
Теперь мы можем думать об этом, как двухступенчатый процесс: от каждой пары в исходном списке мы собираемся получить список:
magicPair :: ([Char], [Char]) -> [(Char, Char)]
magicPair (a,b) = zip a b
Теперь нам нужно отобразить magicPair
над всеми элементами в исходном списке и сцепить результат:
magic xs = concat (map magicPair xs)
Комбинация concat . map f
настолько часто, что существует такая функция называется concatMap
для этого:
magic xs = concatMap magicPair xs
А с помощью функции f
на паре вместо двух аргументов является обычным явлением, так magicPair = uncurry zip
:
magic xs = concatMap (uncurry zip) xs
Теперь мы можем удалить xs
с обеих сторон, чтобы в конечном итоге с окончательным вариантом magic
:
magic = concatMap (uncurry zip)
Который полностью затемненный для любого новичка языка. – Zeta
@Zeta - .... и которые соблазнят их желанием узнать больше о том, как классный Haskell. – jamshidh