Взаимные рекурсивные типы не определяются при использовании списков внутри - PullRequest
0 голосов
/ 30 мая 2018

У меня проблема с компиляцией старого проекта 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>

Что мне не хватает?

1 Ответ

0 голосов
/ 31 мая 2018

Если у вас новая версия VS, у вас не может быть старой «предустановленной» версии FSharp.Core (4.0.0.0).

Итак, ссылка такая:

<Reference Include="FSharp.Core, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />

будет повреждена.

Я не смог воспроизвести ошибку из вопроса, но ошибка, которую я получил, быладовольно просто:

Не удалось разрешить эту ссылку.Не удалось найти сборку "FSharp.Core, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a, processorArchitecture = MSIL"

. Тип "FSharpList <>" определен в сборке, на которую нет ссылок.Необходимо добавить ссылку на сборку «FSharp.Core, версия = 4.3.0.0, Culture = нейтральная, PublicKeyToken = b03f5f7f11d50a3a»

после исправления сборки проекта без ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...