Активный шаблон F# как нестатический член
-
11-09-2019 - |
Вопрос
Я не уверен, разрешены ли нестатические активные шаблоны открытых членов, но вы можете определить их без жалоб компилятора.Если им разрешено, каков синтаксис сопоставления с одним?Компилятор выдает несоответствие типа Foo в FooBar2.doSomething.Ожидая 'a -> Choice<'b,'c>
данный 'a -> 'd -> Choice<unit,unit>
// No error in this class, static works great
type FooBar() =
static member (|Foo|Bar|) (x, y) =
match x = y with
| true -> Foo
| false -> Bar
member x.doSomething y =
match x, y with
| Foo -> ()
| Bar -> ()
type FooBar2() =
member x.(|Foo|Bar|) y =
match x = y with
| true -> Foo
| false -> Bar
// compiler error on "Foo"
member x.doSomething y =
match y with
| Foo -> ()
| Bar -> ()
Решение
Активные шаблоны не следует использовать в качестве членов.Тот факт, что они вообще компилируются, является ошибкой компилятора, которую мы исправим (спасибо за отчет :)).Используйте локальные или привязанные к модулю «let» для определения активного шаблона.
Другие советы
Я не удивлен, что это не работает, и не вижу естественной семантической интерпретации, например, активных шаблонов.Как узнать, какой экземпляр использовать, когда вы видите Foo
шаблон?Могут ли у вас быть разные экземпляры для Foo
и Bar
случаях (и, следовательно, неполное совпадение с образцом)?Кажется, здесь нет элегантного решения проблем.Честно говоря, я удивлен, что даже статический случай работает, и я не вижу в спецификации ничего, что касалось бы определения активных шаблонов как членов любого рода.
Распознаватели членов, похоже, отсутствуют начиная с версии 1.9.9.9.даже для статических членов.Я думаю, что это позор, потому что это допускало перегрузку распознавателя.Я мог бы иметь распознаватель «Имя» для Type, MemberInfo и т. д.Теперь мне нужно иметь «Type_Name».«Имя_участника» и т. д.чтобы избежать конфликтов имен.Просто «Имя» было лучше.