2017-03-22 22 views
0

私はハスケルで宿題をやっていますが、要素ごとに2つのリストを比較して同じ要素にいくつの要素が同じであるかを計算する必要があります。第二のリストの最初の要素を持つリストの最初の要素、など。2つのリストから要素を比較する

は、ここで私が持っているものです。

compare :: [Int]->[Int]->Int 
compare [a] [b]= if head a == head b then 1 + compare (tail a tail b) else 0 + compare (tail a tail b) 

compare [] [b] = 0 

私は、彼らは両方の要素として8つのInt sのリストになることが事前にわかっています。

+0

あなたはこのワンライナー使用することがあります: – Aleph0

答えて

3

持っているすべての場所をカウントすると仮定したタプルのリストに map (uncurry compare) $ zip l1 l2を比較することができあなたのコードに問題があります:

  • ns:compare [a] [b]を定義していますが、headtailで使用しているので、abをリストにします。代わりにcompare a bを定義してください。

  • パターンの順序:最初の試合が勝つので、compare [] b = 0が最初に来るはずです。

  • compare (tail a tail b)は、compareに2つの引数を指定し、tailには3つの引数を指定しないでください。 compare (tail a) (tail b)

すべてが語った:

compare :: [Int] -> [Int] -> Int 
compare [] _ = 0 
compare a b = 
    if head a == head b then 
     1 + compare (tail a) (tail b) 
    else 
     compare (tail a) (tail b) 

そして、それはおそらく、宿題には適していませんが、あなたが特定の位置であるかどうかを示すブール値のリストを取得することにより、これを書くことができることを知って楽しいかもしれませんが等しい、唯一の真の値にそれらをフィルタリング、そして得られた長さを取得する:

compare a = length . filter id . zipWith (==) a 

-- this works too 
compare a = sum . fromEnum . zipWith (==) a 
+0

あいまいな変数回の出現ab' '長$フィルタ(真==)$ zipWith(==)をence "compare" ***参照できる:Main.compare Hugs.Prelude.compare このエラーが発生しました。 –

+0

@KostasThanasis:これはプログラムの 'Main'(デフォルト)モジュールで' compare'を定義したことを意味しますが、 'Hugs.Prelude'(デフォルトで読み込まれる標準ライブラリの部分)はすでに関数は 'compare'という名前なので、' compare'を使うと、コンパイラはあなたが意味するものを知ることができません。 1.あなたは '' GHC Haskellで少なくともHugsについてはわからない ''前置詞を隠す(compare) 'を言う、' 'compare''を何か他のものにリネームする、または3.完全修飾名' Main関数を呼び出すときに '.compare'を呼び出します。 –

+0

名前を変更して正常に動作しました。どうもありがとう –

1

次の2つのリストをzipして、あなたは二つのリストl1l2

を持っており、彼らは同じ要素 length $ filter (== EQ) $ map (uncurry compare) $ zip l1 l2

関連する問題