私はいくつかのパターンでいくつかの計算を行う関数を持っているとしましょう。パターンマッチングの形で実装されています。Haskellは複数のパターンマッチングのlet式を許可していますか?
これらのパターンの大部分は、他のものとは異なるものと共に、私がlet
式の媒介変数を使用するパラメータの処理を行います。しかし、私は多くのパターンで同じlet
を持つことが本当に冗長であることを知り、いくつかのパターンに対してlet
を定義する方法があるのだろうか?ここで
は私の重複let
の例である:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'
あなたは私がintermediary
のためにそれを使用する場合、パラメータxs
が常に存在し、これを因数分解することができることを見ることができます。 ヘルパー機能を使って簡単に達成できましたが、私が求めているものがなければ可能かどうか疑問に思っていました。初心者の方にはシンプルにしてください。
Nope!別の関数を使用し、それをパラメータとして明示的に渡して、繰り返しコードを除外します。ハスケルに関する限り、上記のxsの出現は全く異なる変数である(それらは異なる結合部位を持つため)。 – luqui
ありがとう!今私は別の質問があります:第3と第4の方程式が決して一致しないようにするつもりでしたか? 'xs'はリストにマッチするので...方程式の順序を逆転しましたか? – yatima2975
これは、 'xs'がいくつかのパターンでパターンマッチングから抽出されたが、必ずしも同じ意味を持つとは限らないことを示すために書いています(そうでなければ、パターンマッチングは興味がありません。この例で何が行われたかは重要ではありません。私のコードでは 'y'は実際の値に置き換えられ、後のパターンは一致します。しかし、あなたはもう一度そうですので、私はそれをより理解しやすいように具体的なタイプで編集します。 –