この関数が常に成功するのはなぜですか?常に値とタイプを含むTrue
を返します。これは正しい動作ですか?
f a b = case a of b -> True; _ -> False
受け入れられた完全な答えに加えて、私の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
の先頭にあるf
でnotではありません定義。 ローカルにスコープされた新しい変数を作成しました。したがって、コードは次と同等です。
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