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?
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 tipoResult
en F#. Estos operadores están definidos para los tiposOption
yAsync
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 funcionesResult.bind
yResult.composeK
como operadores para el tipoResult
:“`f#
let (>>=) x f = Result.bind f x
let (<=<) f g x = f x >>= g
Esto debería producir la siguiente salida:
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óduloControl.Monad
en Haskell. Puedes utilizar cualquier símbolo o nombre que elijas.