SML使用其他函数找到正方形/一半的总和

时间:2014-12-01 11:47:40

标签: algorithm sml smlnj

所以我想找到将函数f应用于前n个整数的总和,当将f应用于前n个整数的总和应用于n加上将f应用于前n个整数的总和时,如:

- fun inc x = x+1;
> val inc = fn : inet -> int
- sumF inc 3;
> 9 : int i.e. inc 3+inc 2+ inc 1+ 0

我的sumF现在看起来像这样:

- fun sumF 0 = 0 | sumF n = sumF(n) + sumF(n-1);
val sumF = fn : int -> int
- sumF inc 3;
stdIn:15.1-15.11 Error: operator and operand don't agree [tycon mismatch]
  operator domain: int
  operand:         int -> int
  in expression:
    sumF inc

你可以看到我收到错误,所以也许有人知道如何修复它?因为稍后,我想写sumSq(sumSq n =(n n)+ sumSq(n-1))和sumHalf(sumSq n =(n n)+ sumSq(n-1)) ,使用sumF。 谢谢!

1 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案:

fun sumF f 0 = 0
  | sumF f n = f n + sumF f (n - 1)

您的问题是,您实际上并未在inc函数的定义中使用sumF函数。您只用一个int类型的参数定义sumF函数,但是然后用“two arguments”调用此函数。您的函数调用sumF inc 3被解释为((sumF inc) 3),因为inc的类型是int - > int,但函数需要int类型的参数,你得到错误。而且,除此之外,您的函数还有一个问题 - 它会创建无限循环,因为您在sumF n的定义中调用了sumF n

您可以将上述功能称为

- fun inc x = x + 1;
val inc = fn : int -> int
- sumF inc 3;
val it = 9 : int

或使用匿名函数缩短一点:

- sumF (fn x => x + 1) 3;
val it = 9 : int

问候,Špela