ML - 数据类型和函数

时间:2011-06-23 19:27:51

标签: sml ml

我们有下一个日期类型:

datatype complex = Rec of real * real | Polar of real * real;

和两个功能:

- val real =
fn (Rec(x,y) ) => x
|  (Polar(r,a)) => r * Math.cos(a);

val real = fn : complex -> real

- val imaginary =
fn (Rec(x,y) ) => y
|  (Polar(r,a)) => r * Math.sin(a);

val imaginary = fn : complex -> real

现在,这本书定义了另一个功能:

- val add_complex =
fn (Rec(x, y), Rec(x', y')) => ( Rec( x + x', y + y') )
|  (Rec(x,y), z) => ( Rec( x + real(z), y + imaginary(z) ) )
|  (z, Rec(x, y)) => ( Rec( real(z) + x, imaginary(z) + y) )
|  (z,z') => (Rec( real(z) + real(z'), imaginary(z) + imaginary(z') ) );

val add_complex = fn : complex * complex -> complex

我不明白函数z中的add_complex是什么。

  1. 它是Polar(意思是,我可以写Z =极地(a,b)?如果是,那么编译器如何知道它?意思是 - 它是否得到az,并将其解析为极性变量?

  2. 如果它不是极地,那它可以是什么?

1 个答案:

答案 0 :(得分:0)

在您的代码中,zz'都是Polar,因为第一种情况涵盖了Rec的所有可能性,因此在第二种情况下{ {1}}不是z,或者它会使用第一种情况。同样,在其他情况下,每个Recz必须为z',否则它将被之前的案例捕获。因此,您可以安全地写出Polar,或者更准确地z=Polar(a,b)来表示半径和角度。