6

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

質問を説明するために考案された例を提示しましょう。

まず、開始点として次のコードを検討してください。

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

ここまでは順調ですね。しかし、次に、v3 == 99で差が4未満の場合にゼロを返す必要がある「代替ケース」を処理する必要があると想像してください(完全に任意ですが、これらが私の要件であるとしましょう)。

私の最初の考えはこれを行うことです:

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

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

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

4

2 に答える 2

13

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

someFunction v1 v2 = f
    where
        f 99 | difference < 4 = 0
        f v3 = difference ^ v3
        difference = v1 - v2
于 2009-05-06T04:21:50.987 に答える
0

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

someFunction v1 v2 v3 | v3==99 && difference<4 = 0
                      | otherwise = difference ^ v3
                      where difference = v1 - v2
于 2009-05-06T04:36:53.867 に答える