.net F#指南是否建议声明模块&;具有相同名称的类型?

.net F#指南是否建议声明模块&;具有相同名称的类型?,.net,module,f#,naming-conventions,record,.net,Module,F#,Naming Conventions,Record,阅读之后,我没有看到任何关于是否应该将模块及其类型声明为同名的注释 通常我的项目没有任何循环依赖关系,因此我不需要创建新模块(例如,InfrastructureTypes或DomainTypes)来将每个类型放在一个位置 例如,如果我有一个记录类型System及其一系列函数,我是否应该将所有内容都放在一个模块文件中?这是我的尝试: // System.fs module System type rec System = { name : string children :

阅读之后,我没有看到任何关于是否应该将模块及其类型声明为同名的注释

通常我的项目没有任何循环依赖关系,因此我不需要创建新模块(例如,
InfrastructureTypes
DomainTypes
)来将每个类型放在一个位置

例如,如果我有一个记录类型
System
及其一系列函数,我是否应该将所有内容都放在一个模块文件中?这是我的尝试:

// System.fs
module System

type rec System =
    { name : string
      children : System list }

let init () = { name = ""; children = [] }

let addChild system child =
    { system with system.children = child :: system.children }

let removeChild system child =
    let rec removeChild children acc child =
        match children with
        | c :: children ->
            if c <> child then removeChild children (c :: acc) child
            else removeChild children acc child
        | [] -> List.rev acc

    let children = removeChild system.Children [] child
    { system with system.children = children }
//System.fs
模块系统
类型rec系统=
{name:string
子项:系统列表}
让init()={name=”“;children=[]}
让addChild系统子对象=
{system with system.children=child::system.children}
让removeChild系统子对象=
让rec删除child child acc child=
给孩子们配上
|c::儿童->
如果是c child,则删除child child(c::acc)child
否则删除儿童acc儿童
|[]->List.rev acc
让children=removeChild系统。children[]child
{system with system.children=children}

在F#core库本身中,一种常见的方法是在同一级别上使用相同名称的模块和类型(而不是像您的示例中那样在模块内部使用类型)。例如,有一个
List@MiP-请注意,类型和模块是在同一级别定义的。在您的示例中,您的文件以
模块系统
开头,这是“此文件的整个剩余部分位于名为
系统
的模块内”的缩写。而正确的方法是在同一级别定义类型和模块。我无法在注释框中清楚地说明这一点,因此我将在此基础上发布一个扩展的答案。@QuickBrownFox根据您的解决方案,我需要制作一个主模块,使这些模块和类型处于同一级别,不是吗?@MiP在FS文件中,是的,这些需要进入另一个模块或命名空间。这不会带来另一个问题吗?例如,在模块
计算机
中,有一个类型
内核
和一个类型
用户区
具有相同的访问级别,这显然是错误的。但我认为你的回答可能是最好的情况。@MiP我不确定我是否明白。如果有必要控制对所需级别的访问,则始终可以使用另一个模块级别。我认为您最好以访问控制不重要的方式使用此模式。例如,如果我制作了一个
列表
,那么我可以将我的私人数据放入其中。使用
列表的其他代码不一定能够访问该数据。
type System =
    { name : string
      children : System list }

module System =
    let init () = { name = ""; children = [] }