功能的组成

时间:2010-11-20 09:52:05

标签: smlnj

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

1 个答案:

答案 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))

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