12

ガードは if-then-else (または case ステートメント) の単なる構文糖衣に過ぎないというフレーズをよく耳にします。

誰かが次のインスタンスを脱糖してください:

halfOf :: Int -> Int
halfOf x | even x = div x 2

(機能は意図的に部分的です)

ありがとう、

4

2 に答える 2

12
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
于 2010-11-15T03:55:38.230 に答える
4

パターンマッチングのセマンティクスは、標準の次のセクションで定義されています。パターンマッチングの正式なセマンティクス

あなたの質問に関連するステップは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"

于 2010-11-15T14:59:56.470 に答える