f# - 定义同名的类型和模块时重复定义类型或模块

标签 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 没有。

我究竟做错了什么?

最佳答案

使用 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

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

关于f# - 定义同名的类型和模块时重复定义类型或模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29479931/

相关文章:

f# - Thoth.Json.Net 条件解析

f# - Microsoft Accelerator V2 - toArray2D 问题

F# 用有趣的东西替换 ref 变量

arrays - 在 F# 中访问 GetSlice 方法

f# - 如何向 C# 和 F# 公开尽可能友好的类型?

inheritance - 在 F# 中调用基类显式接口(interface)方法

parsing - fparsec OperatorPrecedenceParser : How to deal with incomplete parentheses

f# - 辅助GCD函数初学者

f# - 转换受歧视工会的特定成员列表的规范方法是什么

c# - 使用 F# 将我的 dll 文件放在哪里