我正在尝试在 moscow ml 中减去两个函数(都是 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 命名约定。)