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