2011-06-23 6 views
0

我々は次のdayatypeを持って、私はdidnのMLのデータ型や関数は

- 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 

」:さて、この本は別の関数を定義し

- 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 

関数 add_complexにある zが何であるかを理解してください。それは、zを取得しており、極性変数にそれを解析 - ??
  1. は、それは(意味、私は=(もしそうであれば、B)、コンパイラはそれを知っているので、どのように極性意味Zを書くことができる極性であります?

  2. それができるようにするもの、極性ではありませんか?あなたのコードで

答えて

0

、最初のケースは、両方ともRecされた可能性のすべてをカバーしているため、両方のzz'Polarありますしたがって、2番目のケースではzRecではないか、最初のケースを使用しています。他の場合も同様に、それぞれzz'Polarでなければなりません。そうしないと、代わりに以前のケースで捕捉されてしまう可能性があります。したがって、z=Polar(a,b)、またはより正確には半径と角度についてはz=Polar(r, a)と書くことができます。

関連する問題