我需要编写一个函数,它接受类型(int * int) list
的输入并打印整数对。这个函数应该利用另一个函数printGenList(接受一个函数f和一个列表l并递归地将f应用于列表的每个元素),其代码我已经这样编写了 -
fun printGenList f l =
if NULL l
then ()
else ( (f (HD l) ); printGenList (f) (TL l) );
并提供一个匿名函数(fn ... => ...构造),它将进行适当的漂亮打印。
答案 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