2013-03-14 7 views
7

私はいくつかのパターンでいくつかの計算を行う関数を持っているとしましょう。パターンマッチングの形で実装されています。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が常に存在し、これを因数分解することができることを見ることができます。 ヘルパー機能を使って簡単に達成できましたが、私が求めているものがなければ可能かどうか疑問に思っていました。初心者の方にはシンプルにしてください。

+2

Nope!別の関数を使用し、それをパラメータとして明示的に渡して、繰り返しコードを除外します。ハスケルに関する限り、上記のxsの出現は全く異なる変数である(それらは異なる結合部位を持つため)。 – luqui

+0

ありがとう!今私は別の質問があります:第3と第4の方程式が決して一致しないようにするつもりでしたか? 'xs'はリストにマッチするので...方程式の順序を逆転しましたか? – yatima2975

+0

これは、 'xs'がいくつかのパターンでパターンマッチングから抽出されたが、必ずしも同じ意味を持つとは限らないことを示すために書いています(そうでなければ、パターンマッチングは興味がありません。この例で何が行われたかは重要ではありません。私のコードでは 'y'は実際の値に置き換えられ、後のパターンは一致します。しかし、あなたはもう一度そうですので、私はそれをより理解しやすいように具体的なタイプで編集します。 –

答えて

7

次のようにこの特定問題は回避することができます。その値が必要な場合は遅延評価xx'

myFunc2 (Something x) = returnSomething x 
myFunc2 (Another n ys) = 
    let xs = drop n ys 
     x = head ys 
     x' = head (tail ys) 
     intermediate = some $ treatment xs 
    in case n of 
     0 -> doSomething intermediate n 
     1 -> doSomething1 intermediate n x 
     2 -> doSomething2 intermediate n x x' 

おかげでのみ評価されます。

- これは大きいですが! myFunc2 (Another 2 [])(実際にxを使用している場合は)のコードを実行すると、ランタイムエラーが発生します。head ysを評価する必要があり、空のリストでクラッシュする可能性があります。例として指定したコードは、一致するパターンがないのでAnother 2 []のためには動作しません(別の実行時エラー)が、フォールバックケースを提供する方が簡単です。

入力を制御して常にAnotherのリストが十分な長さであることを確認しても問題はないかもしれませんが、この問題に注意することが重要です。

+0

これは、 'Another'オブジェクトは空のリストで構築できないので、私のコードでは事実上問題にはなりません。 +1、それは非常にうまくやってくれます。 –

+0

@tehinternetsismadeofcatz:全体の問題は、強力な「スタック言語のためのインタプリタ」として感じています。つまり、コンパイルしても正しく実行されます。しかし、それは近いです!)入力についてあなたが知っていることを表現するのに十分なほど強い。また、MyTypeを変更して、引数についてもっと知っていることを表現することもできますが、それは多くの作業です。 – yatima2975

関連する問題