7

하스켈을 사용하여 두 개의 문자열을 함께 연결하는 중개 연산자를 정의하고 싶습니다. 그러나 연산자가 두 문자열의 겹치는 요소를 연결하는 여분의 절을 넣고 싶습니다.두 문자열을 합치는 것

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

하지만 어떤 도움에 그것을 통합하는 방법을 모르겠어요. 내가 이미 가진 문자열에서 중복되는 부분을 반환하는 방법을 알아 냈

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

그래서 예 있을까?

+2

세 번째 예제가 왜 필요하지 않습니까? –

+1

왜 첫 번째 예제가 "독수리"가 ​​아닌가? 'eagle "="eagleeyes "="독수리 ". – dave4420

+0

예, 죄송합니다. 제가 예제 출력에서 ​​약간의 오류가 있음을 깨달았습니다. – Bobo

답변

8

당신은 약간 잘못된 방향으로 가고 있습니다.

즉, 실제로 겹치는 부분은 신경 쓰지 않아도됩니다.


여기 명시 적 재귀가없는 다른 해결책이 있습니다.

(++++) :: 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 (플립 stripPrefix ys) (꼬리 xs)] –

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

이 빨리되지 않으므로이의 위에 두 개의 패스를 수행합니다,하지만 난 그게 더 읽기, 그리고 직관적 인 의미가 생각하기 때문에 제공되는 다른 버전.

관련 문제