2009-04-14 2 views
3

ich eine Struktur Rationals (int * int) und einer meiner Funktionen bin erstellen:Wie eine Art in SML (wie Gießen) zwingen

fun diff ((n, d), (n', d')) = let val (top, bot) = sum ((n, d), (~n', d')) 
            in 
            (top/gcd(top, bot), bot/gcd(top, bot)) 
            end 

gcd gibt mir den größten gemeinsamen Nenner, so Ich habe nicht 2/8, sondern 1/4, wie es sein sollte. gcd benutzt mod um den gcd zu finden, also gibt es einen int zurück. Aber ich kann den Ausdruck mit Division nicht als Int interpretieren. Als ich versuchte, am Ende der Diff-Deklaration : int * int hinzuzufügen, gibt es mir einen Typfehler, dass die Ausdrücke real * real und int * int nicht übereinstimmen.

Wie kann ich eine ganzzahlige Division erzwingen oder den Ausdruck in eine Ganzzahl umwandeln? Wenn beides möglich ist, welches ist besser?

Antwort

5

Ja, Sie verwenden den falschen Operator. / ist der Floating-Point-Division-Operator. div (wie von D. Shawley erwähnt) ist der Integer-Division-Operator. div ist in diesem Fall das Richtige, weil Sie zwei ganze Zahlen teilen und eine ganze Zahl erhalten möchten.

2

Hat SML zufällig einen Operator div? Es ist Jahre her, seit ich mit ML gespielt habe, aber es scheint, als wäre es ein ziemlich normaler Weg, um eine ganzzahlige Division zu erzwingen.