Вызов многоадресного активного шаблона напрямую

Рассмотрим один активный шаблон:

let (|ToUpper|) (input : string) = input.ToUpper();;

Я могу вызвать вышеупомянутый активный шаблон одного случая вне явного соответствия:

let g ( ToUpper  x ) =x ;;
> val g : string -> string

g ("hello");;              
> val it : string = "HELLO"

Если у меня есть следующий многозадачный активный шаблон:

let (|Even|Odd|) n =  if (n % 2 = 0) then Even else Odd ;;

Как я могу вызвать вышеупомянутый многозадачный активный шаблон напрямую? Очевидный способ не работает:

let h ( |Even|Odd| n) = n;;
пусть h ( | Четный | Нечетный | n) = n;;  
-------------------^
/home/shing/stdin(76,20): ошибка FS0623: Идентификаторы регистра активного шаблона должны начинаться с заглавной буквы

Причиной вышеупомянутого запроса является написание теста для активного шаблона без явного введения соответствия. В настоящее время, если я хочу протестировать активный шаблон |Even|Odd|, мне нужно ввести следующую функцию isEven.

let isEven n =
    match n with
    | Even -> true
    | Odd -> false


[<Test>]
let evenTest1()  =
    (isEven 6) |> should equal true

Было бы хорошо, если бы я мог сделать:

[<Test>]
let evenTest1()  =
    (|Even|Odd| 6 ) |> should equal Even   // Does not work. 

Спасибо заранее за любую помощь!

Shing

0 ответов

Другие вопросы по тегам