2014-11-12 6 views
0

지연 목록에서 중복을 제거해야합니다. 여기에 쓸 수있는 코드 조각이 있지만 올바르게 작동하도록 수정하는 방법에 대한 단서가 없습니다.지연 목록에서 중복 제거 Ocaml

정규 목록을 사용하여이 작업을 수행하는 방법을 알고 있지만 지연 목록은 여전히 ​​새로운 내용이므로 도움이 될 것입니다. 다음은 작성하려고 시도한 코드입니다.

let rec removeDuplicate = function 
LNil -> LNil 
|LCons(x,xf) -> x::(removeDuplicate (List.filter (fun a -> a<>x) xf));; 

미리 도움을 주셔서 감사합니다.

+0

유형 정의 – ivg

+0

유형 'a llist = LNil – user4165421

+0

http://typeocaml.com/에 두 개의 게시물이 약간 도움이 될 수 있습니까? –

답변

1

첫 번째 문제는 두 번째 절에 지연 목록을 작성하는 대신 실제로 list에 OCaml이 내장되어 있고 consync 연산자가 :: 인 것입니다. 또한 꼬리 부분에 List.filter을 사용할 수 없습니다. 너의 목록이 아닌 'a list 유형의 값에서도 작동하므로 꼬리 부분에 List.filter을 사용할 수 없습니다.

+0

좋아요, 그래서 저는 자신의 연결 연산자 (@ $)를 정의했습니다. 실제로는 지연 목록과 잘 맞습니다. 이 코드에서 List.filter를 대체하는 방법에 대한 힌트를 제공해 줄 수 있습니까? – user4165421

+0

지연 목록은 꼬리 계산을위한 머리와 함수로 구성됩니다. 필터링 된 지연 목록은 좋은 머리를 얻으려면 (필요한 경우 꼬리 기능을 호출하여) 목록을 조사해야합니다. 그러면 필터 함수 자체가 꼬리입니다. –

+2

다른 힌트를 줄 수도 있고 열렬한 목록을 구현하려고 시도 할 수도 있습니다. 즉, ocaml의 표준 목록을 다시 구현하면 나중에 쉽게 게으른 목록 문제를 해결할 수 있습니다. 시작하는 힌트로서, 열렬한리스트 타입은'type '으로 표현 될 수있다. lst = Nil | Cons 'a * lst'. – ivg