2012-03-25 4 views
0

입력이 튜플 목록이고 출력이 각 튜플의 첫 번째 요소가 함께 그룹화 된 두 번째 튜플 문제를 해결하기 위해 노력 해왔다. 즉 [(1,2), (3,4), (5,6)] -> ([1,3,5], [2,4,6])).SML 쌍 튜플 변환

이 코드 생각했지만 그것은 나에게 오류 제공 : 수정을위한

fun convert L = foldl (fn ((x,y),(u,v)) => (([email protected]),([email protected])) ([],[]) L; 

어떤 제안?

답변

3

병합 (@)는 두 개의 목록이 필요하지만 단일 요소 목록을 만들기 위해 []로 포장 할 필요가 있으므로 x와 y는, 값은 다음과 같습니다

fun convert l=foldl (fn((x,y),(u,v))=>([email protected][x],[email protected][y])) (nil,nil) l 

대신 연결의 단점을 사용할 수 있습니다 반환 된 튜플의 목록은 바뀌지 만,

fun convert l=foldl (fn((x,y),(u,v))=>(x::u,y::v)) (nil,nil) l 
1

@ 목록을 연결합니다 (및 xy은 목록이 아님).

시도 ([email protected][x],[email protected][y]).

그러나 추가는 선형 시간 연산 인 반면에, prepending (즉, x :: u)은 일정합니다. Alex가 지적했듯이 목록을 역순으로 만들지 만 역순으로 입력을 처리하여이를 해결할 수 있습니다 (foldl 대신 foldr을 사용).