Concat两个字符串在一起

Bob*_*obo 7 string haskell functional-programming concatenation string-concatenation

我想使用Haskell定义我自己的中缀运算符,它将两个字符串连接在一起.但是,我想抛出一个额外的子句,其中运算符将连接两个字符串中的重叠元素.所以一个例子就是

"eagle" myinfix "eagleeyes" = "eagleeyes"
"water" myinfix "book" = "waterbook"
"need" myinfix "education" = "needucation"
Run Code Online (Sandbox Code Playgroud)

我已经想出如何返回字符串中的重叠部分:

check x y = head $ filter (`isPrefixOf` y) (tails x)
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将其纳入.任何帮助?

dav*_*420 8

你会以一种错误的方式解决它.

(+++) :: Eq a => [a] -> [a] -> [a]
xs     +++ ys | xs `isPrefixOf` ys = ys
(x:xs) +++ ys                      = x : (xs +++ ys)
Run Code Online (Sandbox Code Playgroud)

也就是说,你真的不在乎重叠是什么,你只关心你是否已达到它.


这是没有显式递归的另一种解决方案.

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

在这里,我们去寻找的重叠,在你check,但不是保持重叠,我们得到的部分xs重叠.