3

この小さなヘルパー関数があります

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 で) どうすればそれができるかということです。

4

1 に答える 1