where子句中的函数参数

时间:2013-07-10 15:03:52

标签: haskell

请告诉我在'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

这是正确的写作方式吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

一般来说,我会说第一个例子更简单,更容易阅读。如果complexMath不止一次使用sum函数(即使用不同的参数),那么当然你必须使用第二个版本。