Haskellで関数を定義する2つ以上の方程式で同じwhere / letブロックを共有できますか?
-
06-07-2019 - |
質問
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
所属していません StackOverflow