List 递归函数,用于漂亮地打印列表中的元素

List 递归函数,用于漂亮地打印列表中的元素,list,recursion,sml,smlnj,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…=>…构造),它将执行适当的漂亮打印。您应该看看 实际上,您必须使用以下签

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

fun printGenList f l =
if NULL l
then ()
else ( (f (HD l) );  printGenList (f) (TL l)  );
并提供一个匿名函数(fn…=>…构造),它将执行适当的漂亮打印。

您应该看看 实际上,您必须使用以下签名定义函数:

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

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

类型签名告诉您有一个整数对列表。一对整数的示例是
(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

接受这个答案:-)