gpt4 book ai didi

haskell - where 子句中的函数参数

转载 作者:行者123 更新时间:2023-12-01 10:00:01 25 4
gpt4 key购买 nike

你能告诉我在“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

这是正确的写法吗?

最佳答案

局部常量

两者都是正确的语法,但在 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

关于haskell - where 子句中的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17574164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com