2016-04-10 4 views
2

Я пытаюсь отобразить список кортежей в другой список кортежей без везения.Haskell отображает список кортежей в список кортежей

Пример входных данных:

a = [("eo","th"),("or","he")] 

Пример вывода:

[('e','t'),('o','h'),('o','h'),('r','e')] 

Я попытался:

map (\(a,b) -> (a!!0,b!!0):(a!!1,b!!1):[]) a 

, но он производит:

[[('e','t'),('o','h')],[('o','h'),('r','e')]] 

ответ

3

Вы должны использовать 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) 
1

Вот быстрый способ, чтобы дать вам выход

simplify = (>>= uncurry zip) 
+2

Который полностью затемненный для любого новичка языка. – Zeta

+1

@Zeta - .... и которые соблазнят их желанием узнать больше о том, как классный Haskell. – jamshidh

Смежные вопросы