我无法在F#签名文件中定义文字。
我有一个文件File.fs
,如下所示:
module Thingo =
[<Literal>]
let hello = "world"
我需要为它创建一个签名文件,所以最初尝试了这个(File.fsi
):
module Thingo =
[<Literal>]
val hello : string
这导致File.fsi
:A 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
我尝试了这种确切的语法,但它也没有用。
感谢阅读!任何建议将不胜感激。
答案 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"