如何正确使用Result.bind
how to properly use Result.bind
我目前正在尝试在我的 F# 程序中实施一些验证,但我遇到了一些我无法解决的编译时错误。
归根结底,我正在尝试这样做
let ifFalseThenError x errorMessage = function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder : float[]) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2)
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error")
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError")
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float[]) : float[] =
let initialeSandssynligheder = [|1.0;1.0;1.0;1.0;1.0|]
let initssh = initialeSandssynligheder
|> val1
|> Result.bind val2 // Error here
initssh
所以我的编译器告诉我,我的类型不匹配。我知道,val1 和 val2 都需要一个 float[] 和 returns 一个 Result 并且我需要对此进行补偿,当我在我的 val2 中进行管道传输时,我虽然可以通过使用 Result.bind。我误会什么了
我的错误:
Error FS0001 Type mismatch. Expecting a
'(bool -> Result<float [],string>) -> 'a'
but given a
'Result<'b,'c> -> Result<'d,'c>'
The type 'bool -> Result<float [],string>' does not match the type 'Result<'a,'b>'... (Path)
因此,在将 Result.bind 语句添加到上次验证时,消息告诉我我在补偿什么
如评论中所述,存在多个编译错误:
- 不正确的数字数据类型
- 函数缺少参数
- 错误 return 在
beregnAlleOvergangssandsynligheder
中键入提示
这是一个解决这些编译错误的版本,其中包含描述更改位置的注释:
let ifFalseThenError x errorMessage =
function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder: float array) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2.0) // changed to float
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error" x) // include x arg
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError" x) // include x arg
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float array) : Result<float array, string> = // Mixing list/array, hint return result
let initssh =
initialeSandssynligheder
|> val1
|> Result.bind val2 // Error here
initssh
beregnAlleOvergangssandsynligheder [| 1.0; 1.0; 1.0; 1.0; 1.0 |] // Error because sum > 2
beregnAlleOvergangssandsynligheder [| -1.0 |] // Error because of negative value
beregnAlleOvergangssandsynligheder [| 1.0 |] // Ok
我还会查看 array/list/seq 的用法,例如您正在使用数组,但我在这里没有看到任何特定需求,也许 seq 就足够了?尝试选择您需要的那个。
您对如何使用 Result.bind 的直觉是正确的。但是,您的代码中存在一些错误:
函数 ifFalseThenError 接受一个你不接受的布尔值
路过,在两个val1,val2.
在 val1 中,您需要使用浮点值,例如2.0 而不是 int 2.
此处更正
let ifFalseThenError x errorMessage = function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder : float[]) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error" x)
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError" x)
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float[]) =
let initialeSandssynligheder = [|1.0;1.0;1.0;1.0;1.0|]
let initssh = initialeSandssynligheder
|> val1
|> Result.bind val2
initssh
ps。解决这些问题的一个好方法是为所有函数和参数添加类型注释。
我目前正在尝试在我的 F# 程序中实施一些验证,但我遇到了一些我无法解决的编译时错误。 归根结底,我正在尝试这样做
let ifFalseThenError x errorMessage = function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder : float[]) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2)
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error")
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError")
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float[]) : float[] =
let initialeSandssynligheder = [|1.0;1.0;1.0;1.0;1.0|]
let initssh = initialeSandssynligheder
|> val1
|> Result.bind val2 // Error here
initssh
所以我的编译器告诉我,我的类型不匹配。我知道,val1 和 val2 都需要一个 float[] 和 returns 一个 Result
我的错误:
Error FS0001 Type mismatch. Expecting a
'(bool -> Result<float [],string>) -> 'a'
but given a
'Result<'b,'c> -> Result<'d,'c>'
The type 'bool -> Result<float [],string>' does not match the type 'Result<'a,'b>'... (Path)
因此,在将 Result.bind 语句添加到上次验证时,消息告诉我我在补偿什么
如评论中所述,存在多个编译错误:
- 不正确的数字数据类型
- 函数缺少参数
- 错误 return 在
beregnAlleOvergangssandsynligheder
中键入提示
这是一个解决这些编译错误的版本,其中包含描述更改位置的注释:
let ifFalseThenError x errorMessage =
function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder: float array) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2.0) // changed to float
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error" x) // include x arg
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError" x) // include x arg
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float array) : Result<float array, string> = // Mixing list/array, hint return result
let initssh =
initialeSandssynligheder
|> val1
|> Result.bind val2 // Error here
initssh
beregnAlleOvergangssandsynligheder [| 1.0; 1.0; 1.0; 1.0; 1.0 |] // Error because sum > 2
beregnAlleOvergangssandsynligheder [| -1.0 |] // Error because of negative value
beregnAlleOvergangssandsynligheder [| 1.0 |] // Ok
我还会查看 array/list/seq 的用法,例如您正在使用数组,但我在这里没有看到任何特定需求,也许 seq 就足够了?尝试选择您需要的那个。
您对如何使用 Result.bind 的直觉是正确的。但是,您的代码中存在一些错误:
函数 ifFalseThenError 接受一个你不接受的布尔值 路过,在两个val1,val2.
在 val1 中,您需要使用浮点值,例如2.0 而不是 int 2.
此处更正
let ifFalseThenError x errorMessage = function
| true -> Ok x
| false -> Error errorMessage
let val1 (initialeSandssynligheder : float[]) =
initialeSandssynligheder
|> Seq.sum
|> (fun x -> x < 2.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "Some error" x)
let val2 initialeSandssynligheder =
initialeSandssynligheder
|> Array.exists ((<) 0.0)
|> (fun x -> ifFalseThenError initialeSandssynligheder "SomeOtherError" x)
let beregnAlleOvergangssandsynligheder (initialeSandssynligheder: float[]) =
let initialeSandssynligheder = [|1.0;1.0;1.0;1.0;1.0|]
let initssh = initialeSandssynligheder
|> val1
|> Result.bind val2
initssh
ps。解决这些问题的一个好方法是为所有函数和参数添加类型注释。