将绑定和 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
,我的首选是使用标准库函数- 它们可能会使您的代码更长,但可以说它更具可读性。
我正在尝试将绑定 (>>=
) 和 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
,我的首选是使用标准库函数- 它们可能会使您的代码更长,但可以说它更具可读性。