模块中的歧视联盟

时间:2015-06-30 19:17:52

标签: f#

以下工作正如我所料。

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
然后,模块外部代码中的

responselet response = Module.createResponse true

无论是否在模块中放入一些代码,我都无法获得相同的结果吗?

1 个答案:

答案 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.SuccessModule.Failure。它的外观和声音令人困惑,因为它是。对于区别联合类型和另一个区别联合类型的case-id,同样给出了"Result"的名称。我会将Response类型更改为以下内容:

type Response  =
    | RespResult of Result