このチュートリアルでは、パターン マッチングの非常に基本的な例をいくつか示します。たとえば、整数を照合して C スタイルの switch ステートメントをエミュレートするなどです。このチュートリアルでは、タプル型に対する基本的な分解と構造の分解を行う方法も示します。
ベクトルに対してパターン マッチを行うことは可能であるように思われますが、正しい構文を理解できず、その例も見つかりませんでした。
たとえば、Haskell では、リストを簡単に分解できます。
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr func initValue [] = initValue
foldr func initValue (x:xs) = func initValue $ foldr initValue func xs
したがって、大まかな翻訳を見ると、次のことができるとよいでしょう。
fn foldr<A, B>(func: fn(A, B) -> B,
initValue: B,
vals: [A]) -> B {
alt vals {
[] { ret initValue; }
_ {
let h = vec::head(vals),
t = vec::tail(vals);
ret foldr(func, func(initValue, h), t);
}
}
}
注: ここで if ステートメントを使用できることはわかっています。これは、ベクトルに対するパターン マッチングの例として使用しているだけです。
これは現在以下を返します:
patterns.rs:10:4: 10:5 error: constant contains unimplemented expression type
patterns.rs:10 [] { ret initValue; }
^
error: aborting due to previous errors
{ .. }
構造体 ( で定義) とタプル ( で定義) を分解するための例がチュートリアルにある( .. )
ので、ベクトルにも特別な構文 ( で定義) が含まれていることを考慮すると、組み込みのサポートが必要なよう[ .. ]
です。
ベクトルを間違った方法で使用している場合は、お気軽に修正してください。