2012-05-02 4 views
1

私はHaskellの初心者です。すなわち、Cは、すべてのループで2により成長し、のiは数字ABの2つの無限リストを持っていると私はx+y年代とx-y年代x <- Ay <- Bの配列を含む他の無限のリストCを作成したいとしましょう。これを行う最も賢い方法は何ですか?haskellの2つのリストに対する2つの操作

答えて

6

無限リストから2要素リストを作成し、連結します。無限リストについては

concat [[x+y, x-y] | (x, y) <- zip listA listB] 
+0

なぜzipを使用するのですか? x < - listA、y < - listB? – nist

+3

@nist:彼らは同じではないので。これはリストのアイテムのすべての組み合わせを示しますが、ここではそれらをペアごとに一致させたいと考えています。しかし、 'ParallelListComp'拡張を使用すると、' | x < - listA | y < - listB'であり、これは 'zip'を使うのと同じです。 – hammar

+0

何か新しいことを学ぶことはいつもうまくありがたいです – nist

4

定義によって、あなたが

:-)そうのように、一緒に無限のストリームを圧縮することであろう明白な方法をデバッグするのはあまりにも巧妙になりますので、あなたはおそらく、最も賢い方法を望んでいない:

zipWith k as bs 
    where 
     k a b = (a + b, a - b) 
+0

を追加しましたこれは私が考えたものですもともとはそれはタプルのリストを返します(与えられた、私は解凍することができます) – marco

+0

確かに、それはアルゴリズムの構造を保持する利点があります。 –

+0

'concat $ zipWith k as bsここでk a b = [a + b、a - b]' – rampion

0
f xs = concat . zipWith go xs where 
     go x y = map (($y).($x)) [(+),(-)] 
1

だけ、それだけで

mkList (x:xs) (y:ys) = x+y : x-y : mkList xs ys 

だと、あまりにも、有限のリストをサポートするために、あなたは基本ケースに

mkList _ _ = [] 
+0

私はこの解決策が最も分かりやすいことを発見しました。 – demi

関連する問題