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 函数被使用了两次。

而这个呢?

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

第二个不需要括号,因为函数应用具有更高的优先级

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使用该函数(即,使用不同的参数),那么您当然必须使用第二个版本。sum

于 2013-07-10T15:10:19.463 回答