2017-02-13 9 views
2

私はhaskellの2つのリストの同じインデックスの要素を比較しようとしています。 2つの要素が同じインデックスで等しい場合、そのインデックスを返す必要があります。 私はfilterとzipを使って2つの関数を比較する方法を知っていますが、私の関数はインデックスの代わりに値を返します。同じインデックスの要素を比較する

compare l1 l2 = map fst . filter (\(x,y) -> x == y) $ zip l1 l2 

私はGHCiのでそれを実行すると、私は

compare [1,2,3,4,5] [1,2,3,7,8,9,11,5] 
[1,2,3] 

を持っている私の代わりに[0,1,2]を持っていると思います。誰も私にこのことについてどうやってヒントを与えることができますか?

答えて

7

あなたはサイズ3のタプルの最初の項目としてインデックスを含めることzip3[0..]を使用することができます。

compare l1 l2 = map (\(i, _, _) -> i) . filter (\(_, x,y) -> x == y) $ zip3 [0..] l1 l2 
5

リストの内包は、チャド・ギルバートの答えはほとんどきれいになります。

compare l1 l2 = [i | (i, x, y) <- zip3 [0..] l1 l2, x == y] 
+1

これは習慣とスタイルの問題です。私は 'compare 'xs ys = map fstと書いたでしょう。フィルタsnd。 zip [0 ..] $ zipWith(==)xs ys' –

4

Data.ListからfindIndices機能を使用してください。 ghciで:

Data.List> findIndices id $ zipWith (==) [1,2,3,4,5] [1,2,3,7,8,9,11,5] 
[0,1,2] 
関連する問題