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 … => … 构造),它将进行适当的漂亮打印。

4

2 回答 2

1

类型签名告诉你有一个整数对列表。一对整数的一个例子是(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
于 2013-11-05T12:51:48.113 回答
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

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

于 2013-11-05T00:03:12.890 回答