.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 = [] }