【问题标题】:Recursive function to pretty-print the elements of a list用于漂亮打印列表元素的递归函数
【发布时间】:2013-11-04 21:38:23
【问题描述】:
我需要编写一个函数,它接受(int * int) list 类型的输入并打印成对的整数。这个函数应该利用另一个函数 printGenList (接受一个函数 f 和一个列表 l 并递归地将 f 应用于列表的每个元素),我写的代码是这样的 -
fun printGenList f l =
if NULL l
then ()
else ( (f (HD l) ); printGenList (f) (TL l) );
并提供一个匿名函数(fn … => … 构造),该函数将执行适当的漂亮打印。
【问题讨论】:
标签:
list
recursion
sml
smlnj
【解决方案1】:
类型签名告诉你有一个整数对列表。一对整数的一个例子是(4,1)。一个 list 对将是 [(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
【解决方案2】:
你应该看看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
我希望你有基本的想法。尝试改进打印格式!