2013-11-04 55 views
1

我需要编写一个函数,输入类型(int * int) list并输出整数对。这个功能应该利用另一个函数printGenList(需要一个函数f和一个列表L和适用f,列出的递归每一个元素),它的代码,我这样写的 -递归函数漂亮地打印列表中的元素

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

,并提供一个匿名函数(FN ... => ...构造)将执行适当的漂亮打印。

回答

1

类型签名告诉你有一个整数对列表。一对int的例子是(4,1)。一个列表对将然后是[(a,b),(c,d),...],而不是,如你试过,一对整数列表。

我相信你很熟悉(x::xs)表示法,因为你似乎在某种程度上理解了列表。如果我们要匹配成对,我们可以这样做:((n,m)::xs)。这种模式将绑定n和m到相应的int和xs到列表的其余部分。然后递归很简单:

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

thanx的帮助..清除了我的怀疑 –

1

你应该看看tuples 你确实有与下面的签名定义功能:

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