Вопрос

Я не уверен, разрешены ли нестатические активные шаблоны открытых членов, но вы можете определить их без жалоб компилятора.Если им разрешено, каков синтаксис сопоставления с одним?Компилятор выдает несоответствие типа 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».«Имя_участника» и т. д.чтобы избежать конфликтов имен.Просто «Имя» было лучше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top