Sml ML-数据类型和函数

Sml ML-数据类型和函数,sml,ml,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)

我们有第二天的时间键入:

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
我不明白函数
add_complex
中的
z
是什么

  • 它是极坐标(意思是,我可以写Z=Polar(a,b)?如果是,那么编译器是如何知道它的?意思是-它得到一个Z,并将其解析为极坐标变量

  • 如果它不是极性的,那么它可以是什么呢


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