定义类型和具有相同名称的模块时,类型或模块的重复定义

Luk*_*vat 4 f#

因此,据我所知,约定是定义您的类型,然后使用对该类型进行操作的函数定义具有相同名称的模块.

我正在尝试这样做,所以我有这个代码

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
Run Code Online (Sandbox Code Playgroud)

我收到的错误是ImmutableRandom(模块的名称带下划线)正在重新定义类型或模块.

在同一个项目中,相同的设置适用于不同的类型,唯一的区别是该类型具有通用参数,而ImmutableRandom则没有.

我究竟做错了什么?

ild*_*arn 7

使用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
Run Code Online (Sandbox Code Playgroud)

这将导致模块以ImmutableRandomModuleIL 命名(因此也可以使用F#以外的语言).这比静态成员有一些优势,在这个答案中有很好的总结:F#代码组织:类型和模块