es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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…

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar en la llamada a la función move(f1) y move(f2) dentro del caso Mix de la expresión match. La función move espera dos argumentos, una figura y un vector, pero solo se pasa la figura (f1 y f2) sin el vector.

    Para solucionar este problema, se necesita pasar el vector como segundo argumento a la función move. Reemplace la línea let newCirc = move(f1) con let newCirc = move f1 v y let newRect = move(f2) con let newRect = move f2 v.

    El código corregido debería verse así:

    let rec move figure (v:int*int) : figure= 
     let vx = fst v
     let vy = snd v
    
     match figure with
     | Circle ((cx,cy) , radius, colour) -> Circle(point(cx + vx, cy-vy), radius, colour)
     | Rectangle((x0,y0), (x1,y1), colour) -> Rectangle(point(x0 + vx, y0 + vy),point(x1 + vx, y1 + vy), colour)
     | Mix(f1,f2) ->
         let newCirc = move f1 v
         let newRect = move f2 v
         let newFig = Mix(newCirc, newRect)
         newFig
    

Comments are closed.