2017-01-14 7 views
2

なしのリストは、私は二つのリストを持っている想像してみて?を連結(++)重複

magic l1 l2 == "Hey there is a turtle" 

より多くの例、私が探しているのリストを連結して、部品を削除します何か

magic "What's going on" "ing on in the world" == "What's going on in the world" 
magic [1,2,3,2] [2,3,2,1] == [1,2,3,2,1] 
magic [1..10] [5..20] == [1..20] 
magic [1,2] [1,2] == [] 

ある - リストは一致 - 唯一の「共同」ではアップ。私が見てきた


もの:

  • ++だけで連結し、私は後だものではありません。
  • Data.List\\リスト差分演算子は、最初のリストの先頭から開始し、どこにあっても2番目のリストからオカレンスを削除するため、機能しません。
  • これにstripPrefixを使用できるかどうかは分かりませんでした。おそらくそれは実行可能ですが、haskellの理解は十分ではありません。

私もthe entire Data.Listモジュールを見てきましたが、私は箱から欲しいものを見つけることができませんでした。

したがって、これを行うために独自の関数を作成する必要があるように見えます。この場合、Prelude関数のソリューションが依存関係を持つものよりも優れています。

+2

を私はこれで、あなたは非常に役立ちます標準ライブラリ関数はないと思うが、少なくとも、あなたが複雑さを気にしなければ、あなた自身でこれをコード化するのはそれほど難しいことではありません。 – leftaroundabout

+0

@leftaroundについて私はそれをする方法を理解できません、私はしばらくの間試してきましたxD – theonlygusti

+1

まあ、純粋な方法は、すべての可能なプレフィックス(['tails')(http:// hackage .haskell.org/package/base-4.9.1.0/docs/Data-List.html#v:tails)を2番目のリストから取り除くことができます。最長を選択してください。 – leftaroundabout

答えて

1

私はそれを行う方法が見つかりました:

import Data.List 
overlap xs ys = xs ++ (ys \\ (head ((tails xs) `intersect` (inits ys)))) 

を私はそれが非常に魅力的見つけることはありませんし、誰かがそれを改善することができます期待しています。

2

ここでは単純な再帰ソリューションです:誰もが、まだこれを書いたので

magic x y = f x y y 
    where f [] y z = y 
     f x [] z = x 
     f (x:xs) (y:ys) z = x : if x == y then f xs ys z else f xs z z 
0

import Data.List (isPrefixOf) 

magic xs ys = s' ++ r' 
    where 
    (s', r') = go xs 
    go [] = ([], []) 
    go (x:xs) 
     | isPrefixOf (x:xs) ys = ([], ys) 
     | otherwise   = (x:s, r) 
     where 
      (s, r) = go xs