递归函数来漂亮地打印列表的元素

时间:2013-11-04 21:38:23

标签: list recursion sml smlnj

我需要编写一个函数,它接受类型(int * int) list的输入并打印整数对。这个函数应该利用另一个函数printGenList(接受一个函数f和一个列表l并递归地将f应用于列表的每个元素),其代码我已经这样编写了 -

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

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

2 个答案:

答案 0 :(得分: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

我希望你能得到基本的想法。尝试改进打印格式!

答案 1 :(得分: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