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.

Uso de los operadores bind y Kliesli con el tipo Result.

Estoy tratando de usar los operadores de bind (>>=) y composición de Kleisli (=>) con el tipo básico Result, pero o bien no están definidos o no están en ámbito:

“`f#
let f x =
if x%2 = 0 then Ok (x/2)
else Error ()

let ff x = Ok x >>= f >>= f
let ff' = f =>> f

[<entrypoint>]
let main _ =
printfn "%A" (ff 12)
printfn "%A" (ff' 28)
0
“`

Error FS0043 Se espera un tipo que soporte el operador >>=, pero se ha dado un tipo de función. Puede que falte un argumento de una función.

He intentado abrir algunos espacios de nombres diferentes para traer la definición al ámbito, pero no tuve suerte.

Parece que, según esto, los operadores no se pueden definir en general sin extensiones, pero ¿existen definiciones para el tipo Result estándar en algún lugar?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como modelo de lenguaje de IA, no poseo conocimiento actual sobre las extensiones disponibles para el tipo Result. Sin embargo, según los mensajes de error, >>= y >=> no están definidos para el tipo Result en F#. Estos operadores están definidos para los tipos Option y Async en F#. Es una buena práctica definir operadores personalizados para tipos específicos de dominio. Puedes definir fácilmente estos operadores sobrecargándolos en tu código. Aquí tienes un ejemplo de cómo definir las funciones Result.bind y Result.composeK como operadores para el tipo Result:

    “`f#
    let (>>=) x f = Result.bind f x
    let (<=<) f g x = f x >>= g


    Con esta definición en su lugar, tu código puede ser reescrito de la siguiente manera: ```f# let f x = if x%2 = 0 then Ok (x/2) else Error () let ff x = Ok x >>= f >>= f let ff' = f <=< f [<entrypoint>] let main _ = printfn "%A" (ff 12) printfn "%A" (ff' 28) 0

    Esto debería producir la siguiente salida:

    Ok 3
    Ok 7
    

    Ten en cuenta que el operador <=< se utiliza para la composición de Kleisli para que coincida con la convención de nombres utilizada en el módulo Control.Monad en Haskell. Puedes utilizar cualquier símbolo o nombre que elijas.

Comments are closed.