【发布时间】:2013-08-22 22:54:11
【问题描述】:
我正在尝试在 moscow ml 中减去两个函数(都是 real 类型)。然后它说“重载 - 不能应用于 real -> real 类型的参数。那么我应该如何编写函数?
fun CircleArea x = x*x*Math.pi
fun SquareArea x:real = 4*x*x
fun Area x = SquareArea - CircleArea
【问题讨论】:
我正在尝试在 moscow ml 中减去两个函数(都是 real 类型)。然后它说“重载 - 不能应用于 real -> real 类型的参数。那么我应该如何编写函数?
fun CircleArea x = x*x*Math.pi
fun SquareArea x:real = 4*x*x
fun Area x = SquareArea - CircleArea
【问题讨论】:
您可能实际上并不想从另一个函数中减去一个函数,而是这些函数在应用后的返回值。您可以通过以下方式实现:
fun Area x = (SquareArea x) - (CircleArea x)
括号不是强制性的,因为函数应用程序(即SquareArea 和x 之间的空格)比任何二元运算符(包括-)绑定得更紧密。
您应该考虑在 ML 中使用以下命名约定:常规函数具有小写的起始符号,而代数类型的值构造函数具有大写的起始符号。例如:
fun area x = squareArea x - circleArea x
但是:
datatype shape = Square of int * int
| Circle of int
【讨论】:
我们在数学中的函数减法不是作为内置运算符提供的。但是,您可以定义自己的。
从数学上讲,我们定义
(f - g)(x) = f(x) - g(x)
我们可以在 SML 中复制这个定义如下:
infix 5 --
fun f -- g = fn x => f x - g x
它的作用是产生一个运算符--,这样f -- g 就会产生对应于fn x => f x - g x 的函数,即给定x 的函数计算f x - g x。
注意,由于 - 运算符中的类型模糊性,默认情况下允许您减去 'a -> int 函数。在您的情况下,您需要减去 'a -> real 函数,因此您需要稍作修改:
infix 5 --
fun f -- g = fn x => f x - g x : real
如果你使用这个---operator,你将能够像这样定义你的Area函数:
val area = squareArea -- circleArea;
(我冒昧地将函数名称的第一个字母小写,以匹配 SML 命名约定。)
【讨论】: