2012-10-17 3 views
1

L1 = [1,2,3,4,5] 및 L2 [4,5,6,7,8] 인 경우 [1, 2,3,5,7,8] 한 목록에서만 발생하는 요소입니다. 나는 이미 두 목록에서 발생하는 항목의 목록을 반환하는 함수를 작성했습니다.하나의 목록에서 발생하는 요소 목록 반환 - SML

fun exists x nil = false | exists x (h::t) = (x = h) orelse (exists x t); 

fun listAnd _ [] = [] 
    | listAnd [] _ = [] 
    | listAnd (x::xs) ys = if exists x ys then x::(listAnd xs ys) 
else listAnd xs ys 

찾고있는 목록은 L1 @ L2 - (ListAnd L1 L2)로 지정해야합니다. 또한 요소를 삭제하고 중복을 제거하는 함수를 발견했습니다. remDup 함수를 약간 변경하여 여러 번 발생하는 항목을 추적하지 않도록 시도했습니다. 작동시키지 못했습니다. 나는 그것이 작동하도록 모든 기능을 어떻게 사용하고 결합하는지 잘 모르겠습니다.

fun delete A nil = nil 
| delete A (B::R) = if (A=B) then (delete A R) else (B::(delete A R)); 

fun remDups nil = nil 
| remDups (A::R) = (A::(remDups (delete A R))); 

답변

0

diff xs ys 반환 ys의 모든 xs의 요소가 아니라, 당신은 쉽게 listOr 기능을 구현할 수있는 diff 기능이있는 경우 :

diff 기능이 유사하게 쓸 수
fun listOr xs ys = diff ([email protected]) (listAnd xs ys) 

listAnd에가 :

fun diff xs [] = xs 
    | diff [] _ = [] 
    | diff (x::xs) ys = if exists x ys 
         then diff xs ys 
         else x::(diff xs ys)