Всем привет,
У меня небольшой редактор образцов цвета с union из трёх кейсов для палитры. Свежая правка — NotEntered, намеренная очистка — Empty, а Colors хранит список. Я сделал кейсы приватными и открыл наружу только ofColors, где ofColors [] даёт Empty. Я рассчитывал, что компилятор сделает невозможным создание Colors [].
В скриптовой сессии (новая палитра, добавить синий, удалить синий, Save) Save выводит "0 colors" вместо "empty (chosen)". Reset работает правильно. Rider не подчёркивает ничего, сборка чистая.
Сначала я заподозрил List.filter, потом то, что Rider использует другой SDK, чем указан в global.json, поэтому пересобрал из терминала. Результат тот же.
Вот функция, которая, как я думаю, за это отвечает:
let remove (name: string) (p: Palette) =
match p with
| Colors cs -> Colors(cs |> List.filter (fun c -> c.Name <> name))
| other -> other
Приватность проверяется только снаружи Palette.fs, и поэтому мой собственный модуль может свободно создавать Colors []? Страница про контроль доступа вроде бы на это намекает, но я не уверен. Если так, то нормальное ли это исправление — пропускать add и remove через ofColors, или неправильно сам тип? Ещё думаю, не будет ли проще обычный список плюс флаг entered.
Спасибо, Oskar