1

追加の検証関数を通過する数字のみに一致するようにパターンを強化したいと考えています。

let (|IsValid|_|) n = ...

let (|Nil|One|Two|) (l : int list) =
    match l with 
    | a :: b :: t -> Two(a + b)
    | a :: t      -> One(a)
    | _           -> Nil

「One」の場合は簡単です。

    | IsValid(a) :: t -> One(a)

「2」のケースは私には明らかではありません。数値の合計を検証する必要があります。when-guard を使わずにこれを行うことはできますか?

...

編集:次のような when-guard (bool を返す isValid 関数を使用) を使用できます。

    | a :: b :: t when isValid a + b -> Two(a + b)

これは単にパターンを一致させるよりもエレガントではありません。さらに悪いことに、a + b が 2 回適用されます。

また、これは私の実際のコードの簡略化されたバージョンであることに注意してください(たとえば、さまざまな長さのリストに対して単純に一致させようとしているわけではありません)-質問は、二重コンスパターンに対するネストされた一致に関するものです。

4

2 に答える 2

2

私の解決策:親パターンで使用するように設計された戻り値を持つ「ヘルパー」認識機能を追加します。

let (|MatchTwo|_|) = function
    | a :: b :: t -> Some(a + b :: t)
    | _ -> None

そのようにそれを使用してください:

let (|Nil|One|Two|) (l : int list) =
    match l with 
    | MatchTwo(IsValid(a) :: t) -> Two(a)
    |          IsValid(a) :: t  -> One(a)
    | _                         -> Nil
于 2009-01-09T16:27:52.043 に答える