以下工作正如我所料。
type Result =
| Success
| Failure
type Response =
| Result of Result
let response = Response.Result <| Result.Success
match response with
| Result result ->
match result with
| Result.Success -> printfn "Success"
| Result.Failure -> printfn "Failure"
但是,当我将其中的一部分放在模块中时:
module Module =
type Result =
| Success
| Failure
type Response =
| Result of Result
let response = Module.Response.Result <| Module.Result.Success // <- ERROR HERE
我收到错误:
字段,构造函数或成员&#39;成功&#39;未定义
这也意味着我无法匹配:
match response with
| Module.Result result ->
match result with
| Module.Result.Success -> printfn "Success"
| Module.Result.Failure -> printfn "Failure"
以
失败这不是构造函数或文字,或构造函数使用不正确
(为了让此失败,需要添加一些额外的代码,以便Module
有一个createResponse
:
let createResponse b =
if b
then Response.Result <| Result.Success
else Response.Result <| Result.Failure
然后,模块外部代码中的和response
为let response = Module.createResponse true
。
无论是否在模块中放入一些代码,我都无法获得相同的结果吗?
答案 0 :(得分:1)
实际上,完全限定名称Module.Result.Success
应该在第一个错误发生时起作用。编译器混淆是因为你给了两个不同的东西同名。
这一行将编译:
let response = Module.Response.Result <| Module.Success
你可以这样做模式匹配:
match response with
| Module.Result result ->
match result with
| Module.Success -> printfn "Success"
| Module.Failure -> printfn "Failure"
在上一个示例中:您将response
值与Module.Result
与参数result
匹配。它可能只是Module.Response
类型,因为这种类型的单个案例 - 即Module.Result
- 有一个参数。由于此参数的类型为Module.Result
,因此可以针对此类型的两种情况进行匹配:Module.Success
和Module.Failure
。它的外观和声音令人困惑,因为它是。对于区别联合类型和另一个区别联合类型的case-id,同样给出了"Result"
的名称。我会将Response
类型更改为以下内容:
type Response =
| RespResult of Result