对 Result 使用绑定和 Kliesli 组合运算符

Ken*_*len 1 monads f#

我尝试将 bind ( >>=) 和 Kleisli Composition ( >=>) 运算符与基本Result类型一起使用,但它们要么未定义,要么不在范围内:

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
Run Code Online (Sandbox Code Playgroud)

错误 FS0043需要支持运算符“>>=”的类型,但给定了函数类型。您可能缺少函数的参数。

我尝试过open一些不同的名称空间来将定义纳入范围,但没有成功。

从这里看来,如果没有扩展,运算符就不能被一般地定义,但是在任何地方都有标准的定义吗Result

Phi*_*ter 5

F# 核心库中没有定义类似 Haskell 的运算符,而且也不可能定义。您需要在自己的前奏中编写它们,或者使用FSharpPlus等库来实现这些和其他更像 Haskell 的(好吧,类型级别)编程方法。