2012-04-03 4 views
1

J'écris un simple type de données abstrait pour les fractions et Je ne peux même pas faire fonctionner le constructeur, je suis juste très perdu sur la syntaxe SML.SML: Création de types de données abstraites

signature fracs = sig 

type fraction 

exception zero_denominator 

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

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

est le fichier .sig montrant le constructeur que j'implémente. Voici ce que j'ai jusqu'ici. l'erreur que je reçois est que je fais int * int * -> int quand je veux int * int-> fraction. Je sais ce qu'il dit et tout, mais je ne peux pas y arriver.

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

Répondre

2

En fonction de signature, A * B signifie un tuple de deux éléments de types A et B. Cependant, dans la mise en œuvre, A * B signifie la multiplication entre deux entiers.

Ce que vous voulez est de faire une valeur fraction de deux entiers:

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

Oh! Je vois, merci beaucoup! – user1309382