【发布时间】:2020-01-30 03:14:11
【问题描述】:
我有一个 F# 项目,其中包含一个定义类型和模块的文件,如下所示:
module Domain
type TodoID = TodoID of int
module TodoID = let value (TodoID i) = i
let ti = TodoID 1
let i1 = TodoID.value ti // Works as expected
F# 的编译器会自动将后缀“Module”添加到 TodoID,因此解包函数的完全限定名称为 Domain.TodoIDModule.value,正如预期的那样(参见 FS-1019)。
当我从另一个文件中引用该函数时,打开Domain模块如下,一切都很好:
module DTO_working
open Domain
let ti = TodoID 1
let i1 = TodoID.value ti // Happiness
但是,当我有一个没有打开模块的文件,而是尝试完全限定函数时,我无法让它工作:
module DTO_broken
let ti = Domain.TodoID 1
let i1 = Domain.TodoID.value ti // error FS0039: The field, constructor or member 'value' is not defined.
let i2 = Domain.TodoIDModule.value ti // error FS0039: The value, constructor, namespace or type 'TodoIDModule' is not defined
当我在 Visual Studio 中将鼠标悬停在 Domain.TodoID.value 的 value 部分时,它会正确显示全名为 Domain.TodoIDModule.value。
当我手动添加Module 后缀并在任何地方输入它时,它可以工作。
我错过了什么?是否可以在不打开模块的情况下引用具有自动“模块”后缀的函数?
提前感谢您的帮助,
罗兰
【问题讨论】:
-
嗯,当您使用模块名称前缀时,它看起来像,例如
Domain.TodoID,它总是指 DU caseTodoID,而不是类型TodoID,而不是根据上下文选择一个。在我看来这有点奇怪,可能是 F# 中的一个错误。
标签: compiler-errors f#