以ml为单位减去类型为real的函数

时间:2013-08-14 14:51:27

标签: sml ml

我试图在莫斯科ml中减去两个函数(都是类型为real)。然后它说“重载 - 不能应用于真实类型的参数 - >真实。那么我应该如何编写函数?

fun CircleArea  x = x*x*Math.pi

fun SquareArea x:real = 4*x*x

fun Area x = SquareArea - CircleArea

2 个答案:

答案 0 :(得分:5)

您可能实际上并不想从另一个函数中减去一个函数,而是应用这些函数的返回值。您可以通过以下方式实现此目的:

fun Area x = (SquareArea x) - (CircleArea x)

括号不是强制性的,因为函数应用程序(即SquareAreax之间的空格)比任何二元运算符(包括-)都更紧密。

您应该考虑在ML中使用以下命名约定:常规函数具有小写的起始符号,而代数类型的值构造函数具有大写的起始符号。例如:

fun area x = squareArea x - circleArea x

可是:

datatype shape = Square of int * int
               | Circle of int

答案 1 :(得分:1)

我们在数学中减去的函数不是作为内置运算符提供的。但是,您可以定义自己的。

从数学上讲,我们定义

(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的函数计算{{1} }}

注意,由于f x - g x运算符中的类型歧义,它默认允许您减去-函数。在您的情况下,您需要减去'a -> int个函数,因此您需要稍作修改:

'a -> real

如果您使用此infix 5 -- fun f -- g = fn x => f x - g x : real - 运算符,则可以像这样定义--函数:

Area

(我冒昧地将函数名的第一个字母设为小写,以匹配SML命名约定。)