请告诉我在'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
这是正确的写作方式吗?
答案 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
函数(即使用不同的参数),那么当然你必须使用第二个版本。