2015-04-06 100 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

好的。感謝您的澄清。 –