ML - тип данных и функции - PullRequest
0 голосов
/ 23 июня 2011

У нас есть следующий тип:

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. Является ли она полярной (имеется в виду, я могу написать Z = полярная (a, b)? Если этоТак откуда же это знает компилятор? Имеется в виду - он получает az и анализирует его в полярную переменную?

  2. Если он не полярный, то что же это может быть?

1 Ответ

0 голосов
/ 23 июня 2011

В вашем коде оба значения z и z' равны Polar, потому что первый случай охватывает все возможности, в которых оба значения Rec, поэтому во втором случае z не равен Rec,или он использовал бы первый случай.Аналогично, в других случаях каждый z и z' должен быть Polar, поскольку в противном случае он был бы перехвачен предыдущим случаем.Таким образом, вы можете смело писать z=Polar(a,b) или, точнее, z=Polar(r, a) для радиуса и угла.

...