我需要编写一个函数 printGenList ,它接受一个函数 f 和一个列表 l 并递归地将 f 应用于 l 的每个元素。
我试过这个 -
fun printGenList (f (int)list):unit =
( f(HD list); printGenList (f) (TL list) );
我可以为无限列表做同样的事情,但无法获得明确的列表。请帮忙
我需要编写一个函数 printGenList ,它接受一个函数 f 和一个列表 l 并递归地将 f 应用于 l 的每个元素。
我试过这个 -
fun printGenList (f (int)list):unit =
( f(HD list); printGenList (f) (TL list) );
我可以为无限列表做同样的事情,但无法获得明确的列表。请帮忙
你的问题模棱两可。如果我对您的理解正确,您想要一个带有列表、将函数应用于每个元素并打印结果的函数?
如果 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
,它只会打印出整个列表。
(int)
行的 不应该在那里。HD
/TL
应该是hd
/ tl
。list
is的情况nil
。