无法在F#签名文件(.fsi)中使用Literal属性

时间:2018-01-11 17:23:59

标签: f#

我无法在F#签名文件中定义文字。

我有一个文件File.fs,如下所示:

module Thingo =
  [<Literal>]
  let hello = "world"

我需要为它创建一个签名文件,所以最初尝试了这个(File.fsi):

module Thingo =
  [<Literal>]
  val hello : string

这导致File.fsiA declaration may only be the [<Literal>] attribute if a constant value is also given, e.g. 'val x : int = 1'

中出现以下错误

我放弃了:

module Thingo =
  [<Literal>]
  val hello : string = "world"

val hello声明之后的行收到错误:Incomplete structured construct at or before this point in signature file. Expected incomplete structured construct at or before this point or other token.

所以它不喜欢我在签名文件中分配值(或者我不知道如何赋值,非常可能)。

文档说我需要以某种方式分配签名中的值:

  

如果使用Literal属性,它必须同时出现在签名和实现中,并且两者必须使用相同的文字值。

(来自https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/signatures

我还自动生成了一个签名文件(带有--sig构建参数)并且它吐了出来:

module EventSchema = begin
    [<LiteralAttribute ()>]
        val id : string
end

我尝试了这种确切的语法,但它也没有用。

感谢阅读!任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

正确的答案应该是:这是一个错误。据报道:https://github.com/dotnet/fsharp/issues/7897

请注意,作为一种解决方法,您可以关闭light语法,然后在当前版本中使用。

还要注意,当常量值与签名文件中的常量不匹配时,编译器将出错。

答案 1 :(得分:-2)

您应该在模块之前的文件开头使用命名空间或删除“=”符号。此外,不需要类型注释。 F#非常擅长类型推理。

module Thingo
  [<Literal>]
  val hello= "world"

namespace My.App.Modules

module Thingo =
  [<Literal>]
  val hello = "world"