gpt4 book ai didi

.net - F# Guideline 是否建议声明具有相同名称的模块和类型?

转载 作者:行者123 更新时间:2023-12-05 00:15:31 26 4
gpt4 key购买 nike

看完F# Component Design Guidelines ,我没有看到任何评论是否应该声明模块及其类型具有相同的名称。

通常我的项目没有任何循环依赖,所以我不需要创建一个新模块(例如 InfrastructureTypesDomainTypes )将每种类型放在一个地方。

例如,如果我有一个记录类型 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 }

最佳答案

在 F# 核心库本身中,具有相同名称的模块和类型是一种常见的方法 同级 (而不是像您的示例中那样在模块内使用类型)。例如,有一个 List<'a>类型和 List包含函数的模块,该函数包含使用它的函数。与 Option 类似, Set , Result等等

如果您已经有一个具有给定名称的类型,则可以添加一个属性以允许创建具有相同名称的模块而不会出现编译器错误:[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
但是,从 F# 4.1 开始,这是隐含的。所以定义一个与类型同名的模块就可以了,单词Module将在编译代码时位于模块名称的末尾。

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

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

我认为这一切都意味着这可能是在 F# 中使用的有效模式。特别是当你有一个很好的抽象时。您可能想查找“抽象数据类型”,因为我认为它们适用于此。

看看我上面给出的例子,这通常更像是一个库级别的模式,但我听说它也可以在应用程序代码中应用到很好的效果。我可以想象它可以帮助您思考和强制执行抽象边界并保持代码井井有条。

关于.net - F# Guideline 是否建议声明具有相同名称的模块和类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491043/

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