単一のケースのアクティブなパターンを考えてみましょう:
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.
ご協力いただきありがとうございます。
シング