2013-11-04 2 views
1

입력 형식이 (int * int) list이고 정수 쌍이 출력되는 함수를 작성해야합니다. 또 다른 기능 printGenList을 활용해야이 기능 (함수 F와 목록 리터를 받아 목록의 모든 요소를 ​​재귀 적으로 f를 적용) 그 코드 나는 다음과 같이 썼다 -리스트의 요소를 깨끗이 인쇄하는 재귀 함수

fun printGenList f l = 
if NULL l 
then() 
else ((f (HD l)); printGenList (f) (TL l) ); 

와 익명 함수 (는 fn를 제공합니다 ... => ... construct) 적절한 예쁜 인쇄 작업을 수행합니다.

당신은 당신은 실제로 다음 서명으로 함수를 정의 할 필요가 tuples 살펴 보셔야합니다

답변

1

형식 서명은 정수 쌍 목록을 갖도록 지시합니다. 한 쌍의 int의 예는 (4,1)입니다. 리스트의리스트는 [(a,b),(c,d),...]이 되겠지만 시도한 것처럼 정수리스트는 아닙니다.

목록을 어느 정도 이해하고있는 것 같기 때문에 (x::xs) 표기법에 익숙 할 것입니다. 쌍으로 일치 시키려면 다음과 같이 할 수 있습니다 : ((n,m)::xs). 이 패턴은 n과 m을 해당 int와 x를 나머지리스트에 바인딩합니다. 그런 다음 재귀는 간단하다 :이에서 주울 수

fun pInts [] =() 
    | pInts ((n,m)::xs) = print ("("^Int.toString n^", " Int.toString m^")"; 
         pInts xs 

중요한 것은 당신이 하나의 패턴으로 여러 변수를 결합하여 기능에서 사용할 수 있다는 것입니다. 당신이 목록에 두 개 이상의 요소가 있는지 있다면 당신은, 한 번에 여러 요소를 결합 할 수 있습니다

많은 고맙습니다
fun pairs []   = [] 
    | pairs [x]  = [] 
    | pairs (x::y::xs) = (x,y) :: pairs xs 
+0

고맙습니다. 내 의심을 없애줍니다. –

1

:

fn : (int * int) list -> unit 

그래서 기능은 같은 것입니다 : 당신이 기본 얻을 수 있기를 바랍니다

fun pr(lst :(int * int) list) : unit = 
    case lst of 
     [] =>() 
     |(a,b) :: xs => let 
          val out = Int.toString a^Int.toString b 
         in 
          print(out); 
          pr xs 
         end 

생각. 인쇄 포맷을 개선하십시오!

+0

이 ... :-) 내가 –

+0

이 대답을 수락 원하는 정확히 이잖아 도움을 청하는 – user987339