Articulo de referencia

Tipo de resultado

En la programación funcional , un tipo de resultado es un tipo monádico que contiene un valor devuelto o un código de error. Proporcionan una forma elegante de manejar errores, ...

En la programación funcional , un tipo de resultado es un tipo monádico que contiene un valor devuelto o un código de error. Proporcionan una forma elegante de manejar errores, sin recurrir al manejo de excepciones; cuando una función que puede fallar devuelve un tipo de resultado, el programador se ve obligado a considerar las rutas de éxito o fracaso antes de acceder al resultado esperado; esto elimina la posibilidad de una suposición errónea por parte del programador.

Ejemplos

  • En C++ , la biblioteca estándar lo define como . [ 1 ]std::expected<T,E>
  • En Elm , la biblioteca estándar lo define como . [ 2 ]typeResultev=Okv|Erre
  • En Haskell , por convención Eitherse utiliza el tipo para este propósito, que está definido por la biblioteca estándar como , donde es el tipo de error y es el tipo de retorno. [ 3 ]dataEitherab=Lefta|Rightbab
  • En Java , no se encuentra de forma nativa en la biblioteca estándar, pero está disponible en bibliotecas de terceros. Por ejemplo, result4j incluye una interfaz Result<R, E>similar a la de Rust Result<T, E>, y vavr incluye una interfaz Either<L, R>similar a la de Haskell Either a b. Dado que Java y Kotlin son compatibles entre sí, Java puede utilizar el Resulttipo de Kotlin.
  • En Kotlin , la biblioteca estándar lo define como . [ 4 ]valueclassResult<outT>
  • En OCaml , la biblioteca estándar lo define como . [ 5 ]type('a,'b)result=Okof'a|Errorof'btype
  • En Python , no está integrado de forma nativa en la biblioteca estándar, pero está disponible a través de bibliotecas de terceros como returns y result .
  • En Rust , la biblioteca estándar lo define como . [ 6 ] [ 7 ]enumResult<T,E>{Ok(T),Err(E)}
  • En Scala , la biblioteca estándar también define un Eithertipo, [ 8 ] sin embargo, Scala también tiene un manejo de excepciones más convencional .
  • En Swift , la biblioteca estándar lo define como . [ 9 ]@frozenenumResult<Success,Failure>whereFailure:Error
  • En V , el tipo de resultado se implementa de forma nativa utilizando !Tcomo tipo de retorno de una función. Por ejemplo fn my_function() !string { ... }, . Manejo de errores en V.

C++

La expected<T, E>clase se utiliza std::unexpected()para devolver el tipo Ey puede devolverlo Tdirectamente.

importar std ;using std :: expected ; using std :: ifstream ; using std :: string ; using std :: stringstream ; using std :: unexpected ; using std :: filesystem :: path ;clase enumerada FileError { ARCHIVO_NO_ENCONTRADO , SIN_PERMISO , // más errores aquí };esperado < cadena , FileError > cargarConfig ( const ruta & p ) noexcept { si ( ! std :: filesystem :: exists ( p )) { return inesperado ( FileError :: MISSING_FILE ); } ifstream config { p }; stringstream buffer ; si ( ! config . is_open ()) { return inesperado ( FileError :: NO_PERMISSION ); } buffer << config . rdbuf (); config . close (); return buffer . str (); }int main ( int argc , char * argv []) { path p { "configs/my_config.txt" } ; if ( const expected < String , FileError > s = loadConfig ( p ); s.has_value ( )) { std :: println ( " Contenido de la configuración: {}" , s.value()); } else { switch (s.error) { case FileError::MISSING_FILE: std:: println ( " Error : la ruta { } no es válida o no existe ! " , p ) ; break ; case FileError :: NO_PERMISSION : std :: println ( " Error : no hay permiso para leer el archivo en la ruta {}!" , p ); break ; // casos adicionales... default : std :: unreachable (); } } }

Óxido

En Rust, las enumeraciones son uniones etiquetadas , que se pueden desempaquetar con una fuerte comprobación de tipos mediante la coincidencia de patrones.

const CAT_FOUND : bool = true ;fn main () { let result : Result < (), String > = pet_cat (); match result { Ok ( _ ) => println! ( "¡Genial, pudimos acariciar al gato!" ), Err ( error ) => println! ( "¡Oh no, no pudimos acariciar al gato: {error}" ) } }fn pet_cat () -> Result < (), String > { if CAT_FOUND { Ok (()) } else { Err ( String :: from ( "¡El gato no se encuentra por ninguna parte!" )) } }

Vlang

El Errortipo es una interfaz para iError.

const cat_found = truefn main () { cat_name : = get_pet_cat_name () or { println ( "¡Oh no, no pudimos acariciar al gato!" ) exit ( 1 ) }println ( ' Genial , podríamos acariciar al gato ' + cat_name ) }fn get_pet_cat_name () ! string { if cat_found { return ' Max ' } else { return error ( ' el gato no se encuentra por ninguna parte ' ) } }

Véase también

Referencias

  1. "std::expected - cppreference.com" . en.cppreference.com . 25 de agosto de 2023. Archivado del original el 9 de octubre de 2023. Recuperado el 9 de octubre de 2023 .
  2. "Resultado · Una introducción a Elm" . guide.elm-lang.org . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  3. "Data.Either" . hackage.haskell.org . 22 de septiembre de 2023. Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  4. "Resultado - Lenguaje de programación Kotlin" . kotlinlang.org . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  5. "Manejo de errores · Tutoriales de OCaml" . ocaml.org . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  6. "std::result - Rust" . doc.rust-lang.org . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  7. "stdlib: Agregar módulo de resultados · rust-lang/rust@c1092fb" . github.com . 29 de octubre de 2011. Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  8. "Biblioteca estándar de Scala 2.13.12 - scala.util.Either" . www.scala-lang.org . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .
  9. "Resultado | Documentación para desarrolladores de Apple" . developer.apple.com . Archivado del original el 9 de octubre de 2023. Consultado el 9 de octubre de 2023 .