web-dev-qa-db-ja.com

奇妙なパターンマッチング:それは正しいですか?

この関数が常に成功するのはなぜですか?常に値とタイプを含むTrueを返します。これは正しい動作ですか?

f a b = case a of b -> True; _ -> False
9
Paul-AG

受け入れられた完全な答えに加えて、私の2セント:

この:

f a b = case a of b -> True; _ -> False -- (A)

この:

f a b = case a of
                c -> True
                _ -> False --(B)

以下と同等です:

f a b = case a of
    _ -> True

または

f a b = True

または

f _ b = True

したがって、作成した実際の動作である2つのパラメーターを受け取り、常にTrueを返す関数なので、注意してください。

また:

(A)および(B)は、-Woverlapping-patterns 使用されている:

warning: [-Woverlapping-patterns]
    Pattern match is redundant
    In a case alternative: _ -> ...
  |
3 |               _ -> False
  |               ^^^^^^^^^^

ケース定義のbは、bの先頭にあるfnotではありません定義。 ローカルにスコープされた新しい変数を作成しました。したがって、コードは次と同等です。

f a b = case a of
    c -> True
    _ -> False

実際、変数とのパターンマッチングは常に成功します。

2つの値が同じかどうかを確認する場合は、関数を定義する必要があります(またはHaskellに自動的にEqを派生させるなど)。

-Wname-shadowing警告は、既存の識別子を隠す識別子の作成についてコンパイラに警告します。例えば、あなたのコードは以下を生成します:

Prelude> f a b = case a of b -> True; _ -> False

<interactive>:1:19: warning: [-Wname-shadowing]
    This binding for ‘b’ shadows the existing binding
      bound at <interactive>:1:5
24