定义同名类型和模块时重复定义类型或模块
Duplicate definition of type or module when defining a type and a module with the same name
所以据我了解,惯例是定义你的类型,然后在它后面定义一个同名的模块,其中包含对该类型进行操作的函数。
我正在尝试这样做,所以我有这个代码
namespace Rand
type ImmutableRandom
module ImmutableRandom =
open System
val fromSeed : int -> ImmutableRandom
val int : ImmutableRandom -> int
val intInRange : ImmutableRandom -> int -> int -> int
val double : ImmutableRandom -> double
val next : ImmutableRandom -> ImmutableRandom
我收到 ImmutableRandom(模块名称带下划线)正在重新定义类型或模块的错误。
在同一个项目中,相同的设置适用于不同的类型,唯一的区别是该类型有一个通用参数,而 ImmutableRandom 没有。
我做错了什么?
如果类型是通用的,这就有效。否则编译器无法自行解决的歧义
如果您真的觉得需要对非泛型类型执行此操作,请将所有函数定义为该类型的静态成员。有点不太优雅,但你得到相同的表面 API.
在您的模块上使用 CompilationRepresentation
属性,使其在源代码中具有相同的名称,但在 IL 中则不同:
namespace Rand
type ImmutableRandom
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module ImmutableRandom =
open System
val fromSeed : int -> ImmutableRandom
val int : ImmutableRandom -> int
val intInRange : ImmutableRandom -> int -> int -> int
val double : ImmutableRandom -> double
val next : ImmutableRandom -> ImmutableRandom
这将导致模块在 IL 中被命名为 ImmutableRandomModule
(因此在 F# 以外的语言中)。与静态成员相比,这有一些优势,这个答案对此进行了很好的总结:F# code organization: types & modules
所以据我了解,惯例是定义你的类型,然后在它后面定义一个同名的模块,其中包含对该类型进行操作的函数。
我正在尝试这样做,所以我有这个代码
namespace Rand
type ImmutableRandom
module ImmutableRandom =
open System
val fromSeed : int -> ImmutableRandom
val int : ImmutableRandom -> int
val intInRange : ImmutableRandom -> int -> int -> int
val double : ImmutableRandom -> double
val next : ImmutableRandom -> ImmutableRandom
我收到 ImmutableRandom(模块名称带下划线)正在重新定义类型或模块的错误。
在同一个项目中,相同的设置适用于不同的类型,唯一的区别是该类型有一个通用参数,而 ImmutableRandom 没有。
我做错了什么?
如果类型是通用的,这就有效。否则编译器无法自行解决的歧义
如果您真的觉得需要对非泛型类型执行此操作,请将所有函数定义为该类型的静态成员。有点不太优雅,但你得到相同的表面 API.
在您的模块上使用 CompilationRepresentation
属性,使其在源代码中具有相同的名称,但在 IL 中则不同:
namespace Rand
type ImmutableRandom
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module ImmutableRandom =
open System
val fromSeed : int -> ImmutableRandom
val int : ImmutableRandom -> int
val intInRange : ImmutableRandom -> int -> int -> int
val double : ImmutableRandom -> double
val next : ImmutableRandom -> ImmutableRandom
这将导致模块在 IL 中被命名为 ImmutableRandomModule
(因此在 F# 以外的语言中)。与静态成员相比,这有一些优势,这个答案对此进行了很好的总结:F# code organization: types & modules