SML: Создание абстрактных типов данных - PullRequest
1 голос
/ 03 апреля 2012

Я пишу простой абстрактный тип данных для фракций, и я даже не могу заставить конструктор работать, я просто очень запутался в синтаксисе SML.

signature fracs = sig

type fraction

exception zero_denominator

(* constructor *)
val // : int * int -> fraction

/*******************************************************************************************************************************************/

, это файл .sig, показывающийконструктор, который я реализую.Вот что у меня так далеко.ошибка, которую я получаю, состоит в том, что я делаю int * int * -> int, когда я хочу int * int-> дробь.Я знаю, что он говорит, и все, но я просто не могу этого сделать.

structure fracs :> fracs = struct

abstype fraction = frac of int * int
with

exception zero_denominator;
(**********************************)

(*constructor*)
infix 8 //;

fun num // den = if den = 0 then raise zero_denominator 

else
    num * den;

end;(*end ADT*)

end;(*end struct*)

1 Ответ

2 голосов
/ 03 апреля 2012

В сигнатуре функции A * B означает кортеж с двумя элементами типов A и B.Однако в реализации A * B означает умножение между двумя целыми числами.

Вы хотите получить значение fraction из двух целых чисел:

fun num // den = 
    if den = 0 then raise zero_denominator else frac(num, den)
...