2012-04-03 2 views
1

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

signature fracs = sig 

type fraction 

exception zero_denominator 

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

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

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

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*) 

ответ

2

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

Что вы хотите, чтобы значение fraction из двух целых чисел:

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

О! Понимаю, большое спасибо! – user1309382

Смежные вопросы