3

'where' 句内で関数を記述する正しい方法を教えてください。私は質問を表現するのに苦労しているので、例で示したいと思います:

where句の最上位関数に提供されたパラメータを使用できます

complexMath num1 num2 = sum * sum
  where sum = num1 + num2

または、「where」句内で関数をパラメーター化することもできます

 complexMath num1 num2 = (sum num1 num2) * (sum num1 num2)
  where sum n1 n2 = n1 + n2

どちらのバリアントも機能しますが、少なくとも構文に関しては、正しい方法が必要です。それで、それは何ですか?多分それは本当に問題ではなく、私はただ愚かです...

ありがとう。

編集

sum 関数が 2 回使用されるように、関数の例を少しわかりやすくするために変更しました。

そして、これはどうですか?

complexMath num1 = let num2 = 10 + 8 in sum num2 * sum num2
  where sum n2 = num1 + n2

これは正しい書き方でしょうか?

4

2 に答える 2

5

ローカル定数

どちらも正しい構文ですが、where句では、再帰呼び出しでない限り、何もパラメーター化する必要がないため、最初のバリアントの方が優れています。

complexMath num1 num2 = sum + 1000
  where sum = num1 + num2

この非パラメータ化whereは、再利用したい値がある場合に適しています。

complexMath num1 num2 = sum * (sum + 1000) 
  where sum = num1 + num2

関数適用の優先順位が高いため、2 番目のものは括弧を必要としませんでした。

complexMath num1 num2 = sum num1 num2 + 1000
  where sum n1 n2 = n1 + n2

しかしローカルsum関数は一度しか使わないので不要です。実際、この例では、全体をインライン化する方が簡単complexMath num1 num2 = num1 + num2 + 1000ですが、これは単なる例であると確信しています。

パラメータ化したい場所

もっと興味深いことに関数を使用していた場合:

complexMath num1 num2 = triangle num1 + num2 + 1000
  where  triangle 0 = 0
         triangle n = n + triangle (n-1)

複数回呼び出される場合は、パラメータ化する必要があります。

また、繰り返し使用した場合:

complexMath num1 num2 = square (square num1 + square num2 + 1000)
  where square x = x * x
于 2013-07-10T15:11:51.527 に答える
2

一般に、最初の例の方が単純で読みやすいと言えます。関数を複数回 (つまり、異なるパラメーターで)complexMath使用する場合は、もちろん 2 番目のバージョンを使用する必要があります。sum

于 2013-07-10T15:10:19.463 に答える