我需要编写一些函数NTimesComposition(f:(int * int - > int),n:int),它接收一些函数 f 和整数 n 和在做了 f , n次的组合后,像这样的f(x,(f(x,f(x,y))))< - (例如这里) n = 3)我开始在smlnj上写它,但它似乎比我想象的更复杂,提前感谢任何想法:
NTimesComposition(f:(int * int -> int), n:int)
if n = 1 then fn(x,y) => f(x, y ) else NTimesComposition...//here I'm stuck, must be recurstion
答案 0 :(得分:1)
你已经得到了n = 1,你很可能只是忘了在n>的递归调用中传递(x, y)
。 1.显然,这里需要的是fn (x,y) => f (x, ...)
形式,其中...
部分是递归调用的位置。
如果您忘记递归部分中的(x,y)
并使其成为fn (x,y) => NTimesComposition (f, n-1)
,那么您最终将构建一个匿名函数链,如您的参数n
所描述的那样“长”。这将导致您的NTimesComposition
函数的类型不同,具体取决于您提供的n
,由于SML的类型系统的工作方式(Hindley-Milner),该函数无效。
以下两个功能将为您完成工作
fun foo (f, 1) = (fn xy => f xy)
| foo (f, n) = (fn (x,y) => f(x, foo (f, n-1) (x,y)))
和
fun baz (f, 1) xy = f xy
| baz (f, n) (x,y) = f(x, foo (f, n-1) (x,y))
其中第一个使用匿名函数最类似于您的代码。