2016-04-10 11 views
2

タプルのリストを運のないタプルの別のリストにマップしようとしています。タプルのリストタプルのリストへのマップ

例入力:

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

出力例:

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

を、それが生成する:

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

私が試みた

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

答えて

3

結果にconcatを使用するか、mapの代わりにconcatMapを使用する必要があります。結局のところ、マップ内のリストを返すので、リストのリストが得られます。我々は2段階のプロセスと考えることができ、今

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 

現在magicの最後の変種で終わるために両側にxsを削除することができます。

ここでは
magic = concatMap (uncurry zip) 
1

あなたは完全に任意の言語の初心者のために難読化された出力

simplify = (>>= uncurry zip) 
+2

を与えるための簡単な方法です。 – Zeta

+1

@Zeta - ....そして、彼らはHaskellがいかにクールであるかについてもっと学びたいと思って誘惑するでしょう。 – jamshidh

関連する問題