FParsecが文字列に対して行うことを日付に対して行う「日付パーサー」ライブラリはありますか?
つまり、ルールを指定すると、ルールと照合されて、提供されたパターンが認識されます。
逆に、いくつかの解析ルールに基づいて日付を生成するライブラリはありますか?アイデアは、ユーザーに「リアルタイム」の完了を提供して、有効な将来のfparsecマッチングにユーザーを導くことです。
(この生成的構文解析の問題は、人里離れた構文解析サークルに名前がありますか?)
これらの種類のルールを表現するために、単純なドメイン固有言語 (DSL) を定義できます。「パーサー」に対応するタイプは、実際には日付を取り、ブール値を返す単なる関数です。
type DateClassifier = DC of (DateTime -> bool)
簡単な関数をいくつか簡単に定義できます。
// Succeeds when the date is wednesday
let wednesday = DC (fun dt -> dt.DayOfWeek = DayOfWeek.Wednesday)
// Succeeds if the date is after specified limit
let after limit = DC (fun dt -> dt > limit)
// Succeeds if the day is the specified value
let day d = DC (fun dt -> dt.Day = d)
// Takes two date classifiers and succeeds if either of them succeeds
let (<|>) (DC f) (DC g) = (fun dt -> f dt || g dt)
// Takes two date classifiers and succeeds if both of them succeed
let (<&>) (DC f) (DC g) = (fun dt -> f dt && g dt)
条件 - 「その月の 5 日後の次の水曜日」 - を指定するには、次のように実行できる、5 日以降の任意の日に成功する関数を生成するヘルパーが必要です (これは少し非効率的ですが、既存のプリミティブを使用した構成、これは素晴らしいことです):
let afterDay d =
[ for n in d + 1 .. 31 -> day n ] |> Seq.reduce (<|>)
あなたが説明した日にのみ成功する仕様(または「パーサー」)は次のとおりです。
after DateTime.Now (wednesday <&> afterDay 5)