Perl6 には、任意の条件を追加して「サブタイプ」を作成できる「タイプサブセット」の概念があります。
特にあなたの質問について:
subset Probability of Real where 0 .. 1;
と
role DPD[::T] {
has Map[T, Probability] $.map
where [+](.values) == 1; # calls `.values` on Map
}
(注:現在の実装では、「where」部分は実行時にチェックされますが、「実際の型」は(クラスを含む)コンパイル時にチェックされis pure
、std(これは主に perl6 です) (これらは*
などの演算子にもあります)、それはそれに費やされる努力の問題に過ぎません (それ以上の努力は必要ありません)。
より一般的に:
# (%% is the "divisible by", which we can negate, becoming "!%%")
subset Even of Int where * %% 2; # * creates a closure around its expression
subset Odd of Int where -> $n { $n !%% 2 } # using a real "closure" ("pointy block")
次に、数値が Smart Matching operator と一致するかどうかを確認できます~~
。
say 4 ~~ Even; # True
say 4 ~~ Odd; # False
say 5 ~~ Odd; # True
そして、s (または multi 何でも、実際には multi メソッドなど) のおかげでmulti sub
、それに基づいてディスパッチできます。
multi say-parity(Odd $n) { say "Number $n is odd" }
multi say-parity(Even) { say "This number is even" } # we don't name the argument, we just put its type
#Also, the last semicolon in a block is optional