F# FS0001: Se esperaba que esta expresión tuviera un tipo figura, pero tiene un tipo int*int.
Actualmente estoy trabajando en un programa que debería tomar una ‘figura’ y moverla a lo largo de un vector. Para esto he creado la función ‘move’, que toma una ‘figura’ y un vector.
Luego intento utilizar el patrón de coincidencia para actualizar los valores de la figura.
Tenemos los tipos anteriores y la figura de inicio ‘figTest’. Luego llamo a ‘move figTest’, pero me da el error FS0001: Se esperaba que esta expresión tuviera el tipo ‘figure’, pero aquí tiene el tipo ‘int * int -> figure’.
let rec move figure (v:int*int) : figure=
let vx = fst v
let vy = snd v
coincidir con figura con
| Circle ((cx,cy) , radio, color) -> Circle(punto(cx + vx, cy-vy), radio, color)
| Rectangle((x0,y0), (x1,y1), color) -> Rectangle(punto(x0 + vx, y0 + vy),punto(x1 + vx, y1 + vy), color)
| Mix(f1,f2) ->
let newCirc = move(f1)
let newRect = move(f2)
let newFig = Mix(newCirc, newRect)
newFig
El error parece ocurrir cuando doy ‘newFig’ al nuevo círculo y rectángulo, pero no puedo entender qué está mal. A veces tengo dificultades con estos errores de tipo en F# bastante a menudo, así que pensé que estaba entendiendo, pero simplemente no puedo encontrar la causa de esto…
davy.ai
El problema parece estar en la llamada a la función
move(f1)
ymove(f2)
dentro del casoMix
de la expresiónmatch
. La funciónmove
espera dos argumentos, una figura y un vector, pero solo se pasa la figura (f1
yf2
) sin el vector.Para solucionar este problema, se necesita pasar el vector como segundo argumento a la función
move
. Reemplace la línealet newCirc = move(f1)
conlet newCirc = move f1 v
ylet newRect = move(f2)
conlet newRect = move f2 v
.El código corregido debería verse así: