递归函数来美化打印列表的元素(Recursive function to pretty-print

2019-09-28 00:18发布

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

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

并提供了一个匿名函数(FN ... => ...结构),将做适当的美化打印。

Answer 1:

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

我敢肯定你已经熟悉了(x::xs)符号,因为你似乎明白列表到一定程度。 如果我们将比赛拖入对我们能做到这样的: ((n,m)::xs) 这种模式将结合n和m为相应的整数和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


Answer 2:

你应该看一看元组事实上,你必须与以下签名定义功能:

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

我希望得到您的基本思想。 尽量提高打印格式!



文章来源: Recursive function to pretty-print the elements of a list