我想使用Haskell定义我自己的中缀运算符,它将两个字符串连接在一起。但是,我想抛出一个额外的子句,其中运算符将连接两个字符串中的重叠元素。所以一个例子就是
"eagle" myinfix "eagleeyes" = "eagleeyes"
"water" myinfix "book" = "waterbook"
"need" myinfix "education" = "needucation"
我已经想出如何用字符串返回字符串中的重叠部分:
check x y = head $ filter (`isPrefixOf` y) (tails x)
但我不知道如何将其纳入。任何帮助?
答案 0 :(得分: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
部分。
答案 1 :(得分:1)
overlapConcat :: (Eq a) => [a] -> [a] -> [a]
overlapConcat s t = s ++ drop (length $ check s t) t
这不会像其他版本提供的那样快,因为它会对s执行两次传递,但我认为它更具可读性,并且具有直观意义。