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.

de cierre interno y forzar la totalidad

Estoy utilizando FFI para C y la función que llamo devuelve un int para indicar gt, eq o lt. Quiero que el programa falle en cualquier cosa que no sea 1, 0 o -1 porque eso no debería suceder. Y me gustaría que Idris considere 0, 1 y -1 como coincidencias exhaustivas. Intenté lo siguiente:

prim__compare : Scalar -> Scalar -> Int

Ord Scalar where
  compare x y = case prim_compare x y of
                  -1 => LT
                  0 => EQ
                  1 => GT
                  _ => idris_crash ""

pero me sale el siguiente error: Error: compare no está cubierto.

Llama a la función no cubierta Builtin.idris_crash.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error sugiere que la función compare no está cubriendo todos los posibles casos de prim__compare, y que llamar a idris_crash en el caso predeterminado no es suficiente para que Idris considere la función como exhaustiva.

    Para solucionar esto, podrías intentar usar una declaración if en lugar de un case para listar explícitamente los valores de retorno válidos de prim__compare:

    Ord Scalar where
      compare x y = if prim__compare x y == -1
                     then LT
                   else if prim__compare x y == 0
                     then EQ
                   else if prim__compare x y == 1
                     then GT
                   else idris_crash ""
    

    Esto debería hacer que Idris sea consciente de que solo hay tres casos válidos para el valor de retorno de prim__compare, y que llamar a idris_crash en el caso predeterminado es necesario para garantizar la exhaustividad.

Comments are closed.