Получение 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
,