将绑定和 Kliesli 组合运算符与结果一起使用

Using bind and Kliesli composition operators with Result

我正在尝试将绑定 (>>=) 和 Kleisli 组合 (>=>) 运算符与基本 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

Error FS0043 Expecting a type supporting the operator '>>=' but given a function type. You may be missing an argument to a function.

我已经尝试 open 几个不同的命名空间来将定义纳入范围,但没有成功。

看来,如果没有扩展,运算符一般无法定义,但是在任何地方都有标准 Result 的定义吗?

Haskell-like operators 未在 F# 核心库中定义,也可能永远不会定义。您需要在自己的前奏中编写它们,或者使用像 FSharpPlus 这样的库来实现这些和其他更多 Haskell 类(好吧,类型级别)的编程方法。

除了 Phillip 在他的回答中所说的内容之外,补充一下您可以使用内置的 Result.bind 操作和函数组合或管道重写您的示例可能会有用:

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

let ff x = Ok x |> Result.bind f |> Result.bind f
let ff' = f >> Result.bind f

printfn "%A" (ff 12)
printfn "%A" (ff' 28)

这当然只是一个玩具示例,因此很难说出您实际想要做什么,但如果我尝试使用 Result,我的首选是使用标准库函数- 它们可能会使您的代码更长,但可以说它更具可读性。