2011-12-20 2 views
-2

하나의 목록을 다른 목록에서 뺄 수있는 가장 쉬운 방법은 무엇입니까? 이 작업을 해결하려면 ListPair를 사용해야합니까? 노츠는 로우를 비교할 필요가 있다고 생각합니다. 내가 L3 = L2-L1을 적용하여 "L3"을 얻을 필요가SML : 다른 목록에서 하나의 목록을 뺍니다.

L1 = 
[(1, 2, 3), 
(4, 5, 6)] 

L2 = 
[(1, 2, 3), 
(4, 5, 6), 
(3, 2, 3] 

:

L3 = 
[(3, 2, 3)] 

감사 예를 들어, 두 개의 목록 "L1"과 "L2는"이 있습니다.

+0

L1에서도 발생하지만 L1에서 발생하는 요소는 한 번만 제거하면됩니다. – Sarah

+0

L1이 L2의 접두사가 아닌 경우 무엇을 할 계획입니까? –

+0

맞습니다. 그러나 여러 번 발생할 수 있으며 제거해야합니다. –

답변

1

나는이 질문을 이해하기 때문에 L1에있는 L2의 요소를 제거하려고하지만 발생 당 한 번만 제거하려고합니다.

단순한 해결책은이 요소가 제거 된 나머지 L1과 함께 L1에서 요소가 발견되었는지를 알려주는 도우미 기능을 포함 할 수 있습니다.

fun remFirst _ [] rest = (false, rev rest) 
    | remFirst x (y::ys) rest = 
    if x = y then 
     (true, rev rest @ ys) 
    else 
     remFirst x ys (y :: rest) 

이제 목록의 나머지를 진행 한 후 요소를 remFirst가 true를 돌려마다 폐기하고, L2를 반복 할 수 있습니다.

대신 L2가 L1과 공통으로 사용하는 접두사를 제거하려면 상황이 좀 더 간단 해집니다.

fun remPref [] _   = [] 
    | remPref xs []   = xs 
    | remPref (x::xs) (y::ys) = if x = y then remPref xs ys else (x::xs) 

업데이트 : 질문이 변경되었습니다.

L1에있는 요소를 L2에서 제거해야하는 경우 필터가 유용합니다.

+0

감사합니다. 그러나 목록의 단일 요소가 아닌 행을 비교해야합니다. –

+0

귀하의 질문 튜플의 목록을 언급 한 적이 없지만, 괜찮아, 내 대답을 적응할 것입니다. 더 정확한 것을 시도하십시오. – Sarah

관련 문제