ガードは if-then-else (または case ステートメント) の単なる構文糖衣に過ぎないというフレーズをよく耳にします。
誰かが次のインスタンスを脱糖してください:
halfOf :: Int -> Int
halfOf x | even x = div x 2
(機能は意図的に部分的です)
ありがとう、
ガードは if-then-else (または case ステートメント) の単なる構文糖衣に過ぎないというフレーズをよく耳にします。
誰かが次のインスタンスを脱糖してください:
halfOf :: Int -> Int
halfOf x | even x = div x 2
(機能は意図的に部分的です)
ありがとう、
halfOf x =
if even x
then div x 2
else error "Incomplete pattern match"
未処理のケースによってトリガーされるエラーの正確な種類は、言語定義では指定されておらず、コンパイラによって異なります。
edit : 複数のガードやパターンがある場合、各ガードまたはパターンの一致は、前のケースの一致しない部分に入ります。
compare x y
| x == y = foo
| x /= y = bar
compare _ _ = baz
生産する
compare x y =
if x == y
then foo
else if x /= y
then bar
else baz
パターンマッチングのセマンティクスは、標準の次のセクションで定義されています。パターンマッチングの正式なセマンティクス。
あなたの質問に関連するステップはcです。ご覧のとおり、パターンはフォームのガードと一致します
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
次のように、ガードなしのパターン一致に変換されます。
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
したがって、パターンガードは次のように定義されif
、「フォールスルー」は、式を変数にバインドし、のelse
句で1回繰り返してから、フォールスルーif
するパターンで繰り返すことによって実装されます。
(例のように)フォールスルーするケースがない場合は、ステップbによって挿入されます。これにより、デフォルトのケースが挿入されます。_ -> error "No match"