gpt4 book ai didi

f# - F# 命名约定是否禁止在不同光盘中使用相同的名称。工会类型?

转载 作者:行者123 更新时间:2023-12-01 00:38:44 26 4
gpt4 key购买 nike

我在一个模块中有一个通用类型,该类型在另外两个可区分的联合类型中使用。

为了方便起见,我给它们取了一个相同的名字。其他名称不同。接下来,我正在尝试制作一个在控制台中打印类型的助手。

由于匹配案例中的类型不匹配,第一行编译失败。我已经尝试了一些方法,无论是否打开模块、强制类型等,它仍然失败。

另一件事是,如果我将鬃毛更改为 Common1 和 Common2,它可以正常工作。

我记得读过具有相同签名的类型存储在相同的内部类型中,但我的真实示例具有不同的签名并且仍然失败。

我是不是漏掉了什么地方?

例子:

示例编译失败:

Error This expression was expected to have type OneA but here has type OneB

错误

enter image description here

module commonThings =
type CommonThing =
| Comm1 of int
| Comm2 of int

module thingA =
open commonThings
type OneA =
| A1 of string
| Common of CommonThing
| A2 of string

module thingB =
open commonThings
type OneB =
| B1 of string
| Common of CommonThing
| B2 of string

module printAB =
open commonThings
open thingA
open thingB

let printA (msg:OneA) =
match msg with
| A1 v -> printfn "A1"
| Common v -> printfn "Common"
| A2 v -> printfn "A2"

module main =

[<EntryPoint>]
let main argv =
printfn "%A" argv
0 // return an integer exit code

最佳答案

当您打开 thingB 模块时,类型 OneB 进入范围,Common 案例标签来自类型 OneAOneB 类型的隐藏。

当类型或联合/事件模式案例之间发生名称冲突时,最近的一个获胜。重新排序打开会使其偶然工作:

open thingB
open thingA

正确的解决方案是在案例名称前加上前缀。还有 RequireQualifiedAccess 属性,您可以使用它来强制类型(或模块)始终需要其内部结构的前缀。

关于f# - F# 命名约定是否禁止在不同光盘中使用相同的名称。工会类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493104/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com