2015-04-06 90 views
3

所以,据我所知,约定是定义你的类型,然后定义一个模块与它后面的功能相同的名称在类型上操作。定义类型和模块时重复的类型或模块的定义

我试图做到这一点,所以我有这样的代码

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不具有。

我在做什么错?

回答

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

如果这个类型是通用的,否则,编译器无法自行解决的含糊不清。

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

+0

好的。感谢您的澄清。 –