7

2つの文字列を連結するHaskellを使用して自分自身の中置演算子を定義したいとします。しかし、私は演算子が両方の文字列の重複する要素を連結する余分な節を投げたいです。2つの文字列を一緒に連結する

check x y = head $ filter (`isPrefixOf` y) (tails x) 

しかし、私は任意の助けにそれを組み込む方法を知らない:私はすでにと文字列内の重複部分を返す方法を考え出し

"eagle" myinfix "eagleeyes" = "eagleeyes" 
"water" myinfix "book" = "waterbook" 
"need" myinfix "education" = "needucation" 

だから、例があることでしょうか?

+2

3番目の例はなぜ ""必要ではありませんか? –

+1

そしてなぜ最初の例はイーグレーズではないのですか? 'eagleeyes" = "eagleeyes"をチェックします。 – dave4420

+0

ええ、申し訳ありませんが、私は例の出力でいくつかのエラーが発生したことに気付きました。私はそれを訂正しました – Bobo

答えて

8

あなたはちょっと間違った方法でそれについて考えています。

(+++) :: Eq a => [a] -> [a] -> [a] 
xs  +++ ys | xs `isPrefixOf` ys = ys 
(x:xs) +++ ys      = x : (xs +++ ys) 

つまり、オーバーラップが本当に気にする必要はありません。あなたがそれに到達したかどうかは気にかかります。


ここに明示的な再帰がない別の解決方法があります。

(++++) :: Eq a => [a] -> [a] -> [a] 
xs ++++ ys = prefix ++ ys 
    where (prefix, _) : _ = filter (\(_, overlap) -> overlap `isPrefixOf` ys) $ zip (inits xs) (tails xs) 

ここでは、あなたのcheckのように、代わりの重なりを維持する、重複を見つけることについて行く、我々は重複がないことxsの一部を得ます。

+0

もう一つData.List.stripPrefix関数を使っています:xs +++++ ys = xs ++ head [suffix |ちょうど接尾辞< - map(flip stripPrefix ys)(tails xs)] –

1
overlapConcat :: (Eq a) => [a] -> [a] -> [a] 
overlapConcat s t = s ++ drop (length $ check s t) t 

これは、秒にわたって2つのパスを実行しますので、提供された他のバージョンのように高速ではありませんが、私はそれがより読みやすいと思うし、直感的に理にかなっています。

関連する問題