2017-05-14 9 views
0

SML에 처음 입어서 함수 분할을 쓰고 싶습니다. int list -> int list * int list 목록이 있습니다. 정수는 두 개의 정수 목록을 만듭니다. 하나는 음수가 아닌 항목을 포함하고 다른 하나는 음수 항목을 포함합니다.목록을 두 개의 목록으로 나눠서 첫 번째 항목에 양수 항목이 있고 두 번째 항목에 양수 목록이없는 항목 - SML

fun splitup (xs :int list) = 
    if null xs 
    then ([],[]) 
    else if hd xs < 0 
    then hd xs :: #1 splitup(tl xs) 
    else hd xs :: #2 splitup(tl xs) 

여기 내가 얻을 경고입니다 : 다음은 내 코드입니다

ERROR : operator and operand don't agree 
ERROR : types of if branches do not agree 

기능 splitup (TL의 XS)int list * int list 그래서 난 내 재귀 모든 권리해야한다고 생각 반환해야합니다. 무엇이 문제이며 어떻게 해결할 수 있습니까?

답변

1

문제는

hd xs :: #1 splitup(tl xs) 

hd xs :: #2 splitup(tl xs) 

이리스트는 것이다 - 결과이어야하는 목록이 아닌 쌍 - 당신은 ::에서 알 수 있습니다.

비어 있지 않은 경우 먼저 나머지 목록을 분할 한 다음 헤드를 결과의 올바른 부분에 연결하고 결과의 다른 부분을 쌍으로 추가해야합니다.
코드 로트를 단순화하므로 패턴 매칭에 익숙해지는 것이 좋습니다. 이 같은

뭔가 :

fun splitup [] = ([], []) 
    | splitup (x::xs) = let (negatives, non_negatives) = splitup xs 
         in if x < 0 
         then (x :: negatives, non_negatives) 
         else (negatives, x :: non_negatives) 
         end 
+0

내 재귀 목록의 마지막에 온다,이 목록의 쌍과'# 1 splitup (XS)를 반환 '해야 목록. 왜':: # 1 쌍의 목록 '이 잘못 될까요? – DennngP

+0

@DennngP 그것은 한 쌍의 목록으로되어 있기 때문에 잘못되었습니다. 메시지에서 말한 것처럼 조건부의 두 가지 분기는 동일한 유형이어야합니다. – molbdnilo

1

이미 List.partition: ('a -> bool) -> 'a list -> 'a list * 'a list,이 작업을 수행 고차 라이브러리 함수가있다. 혹시 (음, 음이 아닌)로 정수를 분할 할 :

val splitup = List.partition (fn x => x < 0)