2009-07-07 4 views
0

Im essayant de faire une fonction qui renvoie un élément de type « point »:assurer un résultat de type spécifique dans SML

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

mais SMLNJ ne semble pas comprendre mon intention que le résultat devrait être de de type « point », ainsi:

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

Répondre

2

point est un type d'enregistrement, mais vous retournez un tuple à la place.

Que diriez-vous quelque chose comme ceci:

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

Vous pouvez ajouter un garde de type sur le type de retour pour faire le type plus agréable, mais il est équivalent:

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

Spot on! Problème résolu :) – loldrup

+0

@loldrup: Si le problème est résolu, vous devez ** accepter ** cette réponse, en cliquant sur la coche verte sous le compteur de votes. – ephemient

0

Il a été un bon moment que mes jours, mais SML aFAIR le système de type lors de l'impression ne pas résoudre automatiquement les types définis la signature de type. Vous pouvez essayer quelque chose comme ceci:

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

qui renvoie une erreur de syntaxe: - utilisez "test1.sml"; [test1.sml d'ouverture] type de point = {x: int, y: int} test1.sml: Erreur 3,39 à 3,88: expression ne correspond pas à la contrainte [de non-concordance de Tycon] expression: int * int contrainte: Point dans l'expression: ((fn =>) p1 + (fn =>) p2, (fn =>) p1 + (fn =>) p2): Point exception non interceptée erreur élevé à: ../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

Questions connexes