我有一段像这样的代码
if (result-of-a-func-call) > 0
then (result-of-a-func-call)
else -2
有没有办法避免第二次调用相同的函数(使用相同的参数)?在命令式语言中,我们可以做类似
的事情if((result=func-call())>0)
result
else
-2
答案 0 :(得分:7)
您可以使用let
或where
:
f x =
let y = g x
in if y > 0 then y else -2
或者
f x = if y > 0 then y else -2
where y = g x
这两者之间存在细微差别,最值得注意的是where
可以用来定义在函数调用之间不会改变的值,编译器只会定义值一次,而每次调用函数时都会定义一个本地let
,例如
f x = g x
where g y = y * y + 1
与
f x =
let g y = y * y + 1
in g x
在第一个示例中,g
仅定义一次,因为它不依赖于任何f
的参数(x
),而在第二个示例{每次调用g
时都会重新定义{1}}。有理由希望这两种方法都超出了这个答案的范围。
答案 1 :(得分:3)
我会使用case
case theFunction x of
x | x < 0 -> -2
x -> x
话虽这么说,这看起来像是对我的c风格错误检测(即 - 如果函数的结果是&lt; 0,则存在错误,否则结果是值)。在Haskell中,不要这样做!
而是使用monads。例如,使用Maybe。
case theFunction x of
Nothing -> handle error
Just x -> x
(如果处理错误只是意味着将其传递到下一级别,您通常根本不需要case
,monad逻辑将正确处理它)
您可以使用Either
执行类似操作,您可以在其中区分错误类型。