2009-07-07 14 views
0

Im Versuch, eine Funktion zu machen, die ein Element des Typs „Punkt“ zurück:Sicherstellung eines bestimmten Typs Ergebnis in SML

type point = {x : int, y : int}; 
fun pointadd (p1: point, p2: point) = (((#x p1) + (#x p2)), ((#y p1) + (#y p2))); 

aber SMLNJ scheint nicht meine Absicht zu verstehen, dass das Ergebnis sein sollte als auch Typ „Punkt“:

use "test1.sml"; 
[opening test1.sml] 
type point = {x:int, y:int} 
val pointadd = fn : point * point -> int * int 

Antwort

2

point sind ein Record-Typ, aber Sie sind ein Tupel stattdessen zurück.

Wie sei es etwa so:

fun pointadd (p1: point, p2: point) = 
    { x = #x p1 + #x p2, 
     y = #y p1 + #y p2 }; 

Sie können eine Art Wache auf dem Rückgabetyp in dem die Art schöner zu machen, aber es ist äquivalent:

fun pointadd (p1: point, p2: point) : point = 
    { x = #x p1 + #x p2, 
     y = #y p1 + #y p2 }; 
+0

Spot auf! Problem gelöst :) – loldrup

+0

@loldrup: Wenn das Problem gelöst ist, sollten Sie ** diese Antwort akzeptieren, indem Sie auf das grüne Häkchen unter dem Abstimmungszähler klicken. – ephemient

0

Es ist schon eine ganze Weile her, seit meinen SML Tagen, aber die Art System AFAIR nicht definierte Typen automatisch beheben, wenn die Art Signatur zu drucken. so etwas wie diese Sie könnten versuchen:

fun pointadd (p1: point, p2: point) = (((#x p1) + (#x p2)), ((#y p1) + (#y p2))): point 
+0

, die einen Syntaxfehler zurück: - verwenden Sie "test1.sml"; [Öffnung test1.sml] Typ Punkt = {x: int, y: int } test1.sml: 3,39-3,88 Fehler: Ausdruck nicht Einschränkung überein [Tycon Mismatch] expression: int * int constraint: point in Ausdruck: ((fn =>) p1 + (fn =>) p2, (fn =>) p1 + (fn =>) p2): Punkt abgefangene Ausnahme Fehler ausgelöst um: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 ../compiler/TopLevel/interact/evalloop.sml:44.55 ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20 – loldrup

Verwandte Themen