Usando un sustituto / retorno predeterminado en el manejo de una "falla" cuando se usa LanguageExt? -- # campo con functional-programming campo con language-ext camp Relacionados El problema

Using a substitute/default return on handling a “failure” when using LanguageExt?


2
vote

problema

Español

Tengo una función que devuelve un tampoco. Al encontrar un retorno de la izquierda, me gustaría sustituir en algún objeto por defecto y procesar eso. ¿Cuál es el patrón apropiado, usando el lenguaje ext, por hacerlo?

Hay un modelo para esto a continuación: MyFunc devuelve un, y si devuelve un testFail, me gustaría sustituir en una cadena vacía [] y procesar eso. Lo siguiente es feo: verifica nulo y se basa en la conversión implícita de cualquiera de WisData By DA:

  using System.Linq; using LanguageExt;  // Call with true or false to explore each branch ... public void Sandbox(bool succeed) {     Either<TestFail, string[]> myFunc(bool shouldSucceed)     {         if (shouldSucceed)         {             return new[] {"hello", "world"};         }         return new TestFail("i was doomed.");     }      var x =         from response in myFunc(succeed)         let failures = response.Left         let strings = response.Right         from str in failures != null             ? new string[0] // if myFunc failed, just process nothing/null obj             : strings         select "x" + str; }   

con una clase de prueba simple:

  from pathlib import Path  current_dir = str(Path(__file__).resolve().parent)  def func():     print("current_dir", current_dir) 0  

DOS COSAS: 1. El elenco implícito de una sola se expone a iEnumerable a la izquierda y la derecha directamente sin todos los seguros de los aspectos seguros de los cuales tampoco es tan intencional. 2. ¿Cuál es la mejor manera de manejar un fracaso de Myfunc?

El olor es que no estoy interesado en un de MyFunc. Si tengo el control de ello, probablemente debería tragar problemas dentro de él y asegurarme de que devuelvo el incumplimiento del fracaso. Sin embargo, si no tengo control de ello, ¿qué hacer?

Original en ingles

I have a function that returns an Either. On finding a Left return I'd like to substitute in some default object and process that. What's the appropriate pattern, using Language Ext, for doing so?

There's a model for this below - myfunc returns an Either, and if it returns a TestFail I'd like to substitute in an empty string[] and process that. The following is ugly -- it checks null and relies on implicit conversion of Either to EitherData by let:

using System.Linq; using LanguageExt;  // Call with true or false to explore each branch ... public void Sandbox(bool succeed) {     Either<TestFail, string[]> myFunc(bool shouldSucceed)     {         if (shouldSucceed)         {             return new[] {"hello", "world"};         }         return new TestFail("i was doomed.");     }      var x =         from response in myFunc(succeed)         let failures = response.Left         let strings = response.Right         from str in failures != null             ? new string[0] // if myFunc failed, just process nothing/null obj             : strings         select "x" + str; } 

with a simple TestFail class:

public class TestFail {     public string Reason { get; }     public TestFail(string reason)     {         Reason = reason;     } } 

Two things: 1. the implicit cast of a single Either to IEnumerable exposes Left and Right directly without all the safeties of the Either -- is that intentional. 2. what's the nicer way of handling a failure from myfunc?

The smell is that I'm not interested in an Either from myfunc. If I have control of it, I should probably just swallow problems within it and make sure I return the default on failure. If I don't have control of it, however - what to do?

        
     
     

Lista de respuestas

3
 
vote

Hay muchas funciones de ayuda en las Monads en lenguaje, en este caso, en este caso, está tratando de especificar un valor predeterminado si en el estado izquierdo del valor de lo contrario devolverá el valor de la derecha. IFLEFT es para este propósito específico:

  var res = myFunc(succeed).IfLeft(new string[0]);   
 

There are plenty of helper functions on the monads in LanguageExt, in this case you are trying to specify a default value if in the Left state of the Either otherwise return the value from the Right. IfLeft is for this specific purpose:

var res = myFunc(succeed).IfLeft(new string[0]); 
 
 
-1
 
vote

Para mi conocimiento, no puede tener un tipo de devolución variable. Los tipos son obligatorios para que el compilador sepa, la función incluso para llamar o si el contexto que lo usa tiene sentido.

También como regla general, no debe estar luchando con los cheques de tipo. Son tu mejor amigo, no tu enemigo. Y no tenerlos y la conversión implícita agresiva es lo que los resultados en los ejemplos de PHP y JavaScript de este cómic .

La mayoría de las soluciones funcionan alrededor de esto que tiene varios valores de retorno, que pueden ser cada uno de un tipo diferente:

1 Crea una estructura, tupla o clase que puede tener un éxito y un resultado, use el tipo de devolución. Pero ya lo hiciste. Verifique los valores del éxito antes de usar el valor de retorno. Las opciones avanzadas convertirían el resultado en una propiedad, que lanzarán una excepción si el éxito es falso. Consulte la clase de tareas y FondoWorkErcompleTeDeventargs .Result para ejemplos de esto.

2 Haz una herequía de clase poco profunda . Algo como

  abstract class BaseReturnValue { } class FailureValue : BaseReturnValue { } class SuccessValue : BaseReturnValue { string value; }   

La función devolvería el tipo basreeturnvalue. Pero como uno es abstracto, solo puede usar la instancia de ULTVALUE o SuccessValue en el código. El resto son los cheques.

3 Out Preameters. Out le permite tener más de un valor de devolución, sin la necesidad de escribir una clase. Todas las variantes de TryParse () Úselo para devolver un BOOL que indique el éxito, mientras que también le da un entero analizado.

 

To my knowledge, you can not have a variable return type. The types are mandatory for the compiler to know wich function to even call or if the context you use it in makes sense.

Also as a general rule, you should not be fighting type checks. They are your best friend, not your enemy. And not having them and agressive implicit conversion is what results in the PHP and JavaScript examples from this comic.

Most solutions work around this having multiple return values, wich can each be of a different type:

1 Create a struct, tuple or class that can have both a sucess and a result, use that as return type. But you kinda already did that. Check the values of success before using the return value. Advanced options would turn the result into a property, wich will throw an exception if sucess is false. See the Task class and BackgroundWorkerCompletedEventArgs.Result for examples of this.

2 Make a shallow class heirarchy. Something like

abstract class BaseReturnValue { } class FailureValue : BaseReturnValue { } class SuccessValue : BaseReturnValue { string value; } 

The function would return the type BaseReturnValue. But as that one is abstract, you can only use FailureValue or SuccessValue instances in the code. The rest are is checks.

3 Out prameters. Out allows you to have more then one return value, without the need of writing a class. All variants TryParse() use it to return a bool indicating success, while still giving you a parsed integer too.

 
 
 
 

Relacionados problema

3  C # lenguageoxt - Combine múltiples llamadas de ASYNC en una llamada agrupada  ( C sharp languageext combine multiple async calls into one grouped call ) 
Tengo un método que busca un artículo de forma asíncrona de un almacén de datos; class MyThing {} Task<Try<MyThing>> GetThing(int thingId) {...} Quiero...

5  Operaciones asíncronas de la cadena que devuelven usando lenguaje-ext en C #  ( Chain asynchronous operations that return either using language ext in c sharp ) 
Estoy usando la language-ext biblioteca para C # y estoy tratando de cairar operaciones asíncronas que devuelva un tipo Either . Digamos que tengo tres fun...

2  Usando un sustituto / retorno predeterminado en el manejo de una "falla" cuando se usa LanguageExt?  ( Using a substitute default return on handling a failure when using languageext ) 
Tengo una función que devuelve un tampoco. Al encontrar un retorno de la izquierda, me gustaría sustituir en algún objeto por defecto y procesar eso. ¿Cuál es...

0  ¿Cómo construir hashmap anidado en C # usando LanguageExt de una manera más legible?  ( How to build nested hashmap in c sharp using languageext in a most readable way ) 
En .NET / C # Tengo datos de entrada del tipo IEnumerable<T> con T Tener algunas propiedades que quiero usar para las Búsqueda. ¿Cómo puedo crear una bú...

1  El resultado es una excepción nula del lenguaje-ext cuando se trabaja con Mónads  ( Result is null exception from language ext when working with monads ) 
¿Por qué este lanza un "resultado es un resultado" nulo "? ¿No se debe propagar y establecer "A" igual a ninguno? public void test() { Option<string> a...

0  C # LanguageXT LINQ QUERY CON PROCESAMIENTO DE ASYNC  ( C sharp languageext linq query with async processing ) 
Tengo un método que obtiene dos colecciones de diferentes fuentes e invoca un método para combinarlas. El problema es que este método necesita trabajar de for...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos