Haskellで関数を定義する2つ以上の方程式で同じwhere / letブロックを共有できますか?

StackOverflow https://stackoverflow.com/questions/827994

質問

Haskellで関数を定義する2つ以上の方程式が同じwhere / letブロックを共有できますか

質問を説明するために、不自然な例を紹介します。

最初に、開始点として次のコードを検討してください:

someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

これまでのところ、とても良い。しかし、その後、<!> quot; alternative case <!> quot;を処理する必要があると想像してください。v3== 99の場合にゼロを返し、差<!> lt; 4(完全にarbitrary意的ですが、それが私の要件であるとしましょう)。

最初に考えたことはこれを行うことです:

someFunction v1 v2 99 | difference < 4 = 0
someFunction v1 v2 v3 = difference ^ v3
   where
      difference = v1 - v2

ただし、someFunctionの最初の方程式とsomeFunctionの2番目の方程式の両方が同じwhereブロックを共有していないため、これは機能しません。この不自然な例では、whereブロックに変数が1つしかないため(<!> quot; difference <!> quot;)、これは大した問題ではありません。しかし、現実の世界の状況では、多数の変数が存在する可能性があり、それらを繰り返すことは受け入れられません。

ガードを使用して方程式を1つだけにすることで、これを解決する方法をすでに知っています。問題は、複数ので同じwhere / let句を共有する方法はありますか?多数のガードを持つ1つの方程式を強制するのではなく、異なるパターンを持つ複数の方程式を作成することが望ましいと思われるためです。

役に立ちましたか?

解決

1つのオプションは、関数をwhereブロック自体に持ち上げることです。

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2

他のヒント

できないと思います。おそらくあなたの最善の解決策は次のようなものです:

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top