У меня проблема с компиляцией старого проекта F #, расположенного здесь .Файл-ответчик здесь .
Он использует взаимные рекурсивные типы и правильно определен для отступов.Тем не менее, не EDNValue
и EDNValueParsed
не видны на одном уровне контекста / отступа.
module EDNParserTypes =
type EDNException(message : string) =
inherit System.Exception(message)
type QualifiedSymbol =
struct
val prefix: string
val name: string
new (prefix, name) = {prefix = prefix; name = name}
override this.ToString() = "QualifiedSymbol Prefix: " + this.prefix + " Name: " + this.name
end
type EDNValue = EDNNil
| EDNBoolean of bool
| EDNString of string
| EDNCharacter of char
| EDNSymbol of QualifiedSymbol
| EDNKeyword of QualifiedSymbol
| EDNInteger of BigInteger
| EDNFloat of double
| EDNComment of string
| EDNDiscard of EDNValueParsed
| EDNTaggedValue of QualifiedSymbol * EDNValueParsed
| EDNList of string list
| EDNVector of string array
| EDNMap of List<string>
| EDNSet of List<string>
and EDNValueParsed =
struct
val line: int64
val col: int64
val ednValue: EDNValue
new (ednValue, line, col) = { ednValue = ednValue; line = line; col = col }
override this.ToString() =
sprintf "%A" this.ednValue
end
Эти две функции, определенные впоследствии, не компилируются, поскольку EDNValueParsed
не рассматривается как определенное.EDNParserTypes.fs(41,41): Error FS0039: The type 'EDNValueParsed' is not defined. (FS0039) (EDNReaderWriter)
let getLineColString (valueParsed : EDNValueParsed) =
System.String.Format("line: {0}, column: {1}", valueParsed.line, valueParsed.col);
let isNotCommentOrDiscard (v : EDNValueParsed) =
match v.ednValue with
| EDNComment _ | EDNDiscard _ -> false
| _ -> true
Одна любопытная вещь, если я удаляю определение типа части списков, оно не выходит из строя (но, очевидно, терпит неудачу где-то еще, где нужны эти определения)
При удалении этой части типы определены правильно:
| EDNList of string list
| EDNVector of string array
| EDNMap of List<string>
| EDNSet of List<string>
Что мне не хватает?