この小さなヘルパー関数があります
open System
let (|NonEmptyString|) value =
if String.IsNullOrEmpty value
then failwith "String must be non-empty."
else value
let (|StartsWithX|) (value:string) =
if value.StartsWith("X") |> not
then failwith "String must start with X."
else value
また、関数インターフェイスでアクティブなパターン マッチング関数 NonEmptyString を使用すると、問題なく動作します。
let hi (NonEmptyString s) = printfn "Hi %s" s
hi "X" // Hi X
hi "" // System.Exception: String must be non-empty.
今問題に。
次のように、いくつかのバリデーターをより複雑な検証制約として組み合わせるとよいでしょう。
let hi (NonEmptyString s & StartsWithX s) = printfn "Hi %s" s
// error FS0038: 's' is bound twice in this pattern
's' が 1 つしか許可されていない場合は、関数を組み合わせて、引数 s を 1 つだけ持つことを考えることができます。そして、アクティブパターンマッチング関数はもちろん関数なので、関数合成演算子 >> を適用しますが、ここでは当てはまりません。
let hi (NonEmptyString >> StartsWithX s) = printfn "Hi %s" s
// error FS0010: Unexpected infix operator in pattern
問題は、(F# 4.0 で) どうすればそれができるかということです。