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

时间:2015-04-06 21:23:00

标签: 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

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

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

我做错了什么?

2 个答案:

答案 0 :(得分: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

这将导致模块在IL中被命名为ImmutableRandomModule(因此也使用F#以外的语言)。与静态成员相比,这有一些优点,在​​这个答案中有很好的总结:F# code organization: types & modules

答案 1 :(得分:1)

如果类型是通用的,则此方法有效。否则,编译器无法自行解决这种模糊性。

如果您确实需要使用非泛型类型,请将所有函数定义为类型上的静态成员。有点不那么优雅,但你得到相同的表面API。