F # активный шаблон как нестатический член - PullRequest
4 голосов
/ 02 декабря 2009

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

Ответы [ 3 ]

6 голосов
/ 02 декабря 2009

Активные шаблоны не должны использоваться в качестве членов. Тот факт, что они вообще компилируются, является ошибкой компилятора, которую мы исправим (спасибо за отчет :)). Используйте локальные или привязанные к модулю "let" для определения активного шаблона.

3 голосов
/ 02 декабря 2009

Меня не удивляет, что это не работает, и я не вижу естественной семантической интерпретации, например, активных паттернов. Как узнать, какой экземпляр использовать, когда вы видите шаблон Foo? Могли бы вы иметь разные экземпляры для случаев Foo и Bar (и, следовательно, неполного сопоставления с образцом)? Кажется, здесь нет элегантного решения проблем. Честно говоря, я удивлен, что даже статический случай работает, и я не вижу в спецификации ничего, что касалось бы определения активных шаблонов как членов любого вида.

0 голосов
/ 18 февраля 2010

Похоже, что распознаватели участников отсутствуют с версии 1.9.9.9. даже для статических членов. Я думаю, что это позор, потому что это допускало перегрузку распознавателя. Я мог бы иметь распознаватель «Name» для Type, MemberInfo и т. Д. Теперь мне нужно иметь «Type_Name». «Member_Name» и т. Д., Чтобы избежать конфликтов имен. Просто «Имя» было лучше.

...