Получение FS0035 => Конструкция устарела

В проекте на основе fsyacc у меня есть эта строка:

type 'a cucomment = string

Это полное описание ошибки, которое я получаю:

CALast.fs (117,9): ошибка FS0035: эта конструкция устарела: это сокращение типа имеет один или несколько объявленных параметров типа, которые не отображаются в сокращаемом типе. Сокращения типа должны использовать все объявленные параметры типа в сокращаемом типе. Попробуйте удалить один или несколько параметров типа или использовать конкретное определение типа, которое оборачивает базовый тип, например 'type C<' a> = C of... '.

Есть идеи, как это решить?

1 ответ

Решение

F# больше не допускает псевдонимы типов, которые добавляют параметры универсального типа к типу без объявления нового типа. Если вы хотите определить универсальный тип, который охватывает какой-то другой тип, вы должны использовать какой-то конструктор. Например, вы можете использовать единичный дискриминированный союз:

type 'a Cucomment = CC of string

К сожалению, это означает, что вам придется изменить весь код, который использует тип, чтобы развернуть значение, используя сопоставление с образцом или добавив Value член к типу.

Единственный случай, когда допускаются псевдонимы универсального типа, - это когда вы объявляете версию типа с единицами измерения, которая требует специального атрибута. Тем не менее, это, вероятно, не будет работать для вас (потому что единицы ведут себя совершенно по-другому):

[<MeasureAnnotatedAbbreviation>]
type 'a Cucomment = string 

Если это в каком-то коде, сгенерированном fsyacc, то это ошибка в fsyacc, которая должна быть исправлена ​​(я думаю, это было довольно недавнее изменение). В этом случае сообщите об этом fsbugs в microsoft точка com,

Другие вопросы по тегам