0

我需要编写一些函数 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
4

1 回答 1

1

对于 n = 1,您已经得到它,并且您很可能只是忘记(x, y)在 n > 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))

其中第一个最类似于使用匿名函数的代码。

于 2011-01-20T03:12:03.837 回答