-1

我需要编写一个函数 printGenList ,它接受一个函数 f 和一个列表 l 并递归地将 f 应用于 l 的每个元素。

我试过这个 -

fun printGenList (f (int)list):unit =
  ( f(HD list);   printGenList (f) (TL list) );

我可以为无限列表做同样的事情,但无法获得明确的列表。请帮忙

4

2 回答 2

1

你的问题模棱两可。如果我对您的理解正确,您想要一个带有列表、将函数应用于每个元素并打印结果的函数?

如果 f 的输出是可打印的,您可以使用 map 来做到这一点:

fun printGenList f xs = map (fn x => print (f x)) xs

另一种使用显式递归的方法是:

fun printGenList f [] = ()
  | printGenList f (x::xs) = print (f x); printGenList f xs

还有另一种方法(使用 case 语句和 List.hd 和 List.tl 函数,该站点上的许多人似乎都喜欢):

fun printGenList f xs = case xs of
                          [] => ()
                        | xs => print (f (hd xs)); printGenList f (tl xs)

我不知道你对高阶函数的理解有多远,但我建议你尽快掌握它们,因为它们是你在这门语言中最强大的工具之一。我也不太喜欢最后一个解决方案,因为我认为 hd 和 tl 函数只会模糊代码的含义,而不是澄清它。

如果我误解了您的问题并且该函数不应该显式打印自身,您可以执行以下操作:

fun printGenList f:('a -> unit) xs = *code*

使用此函数,您可以调用任何 ('a -> unit) 函数,例如`printGenList print xs,它只会打印出整个列表。

于 2013-11-08T14:48:30.813 回答
1
  • 第一(int)行的 不应该在那里。
  • HD/TL应该是hd/ tl
  • 您需要处理 where listis的情况nil
于 2013-11-08T06:31:13.523 回答