如何避免两次使用相同参数调用相同的函数?

时间:2014-11-17 16:50:34

标签: haskell

我有一段像这样的代码

if (result-of-a-func-call) > 0
    then (result-of-a-func-call)
    else -2

有没有办法避免第二次调用相同的函数(使用相同的参数)?在命令式语言中,我们可以做类似

的事情
if((result=func-call())>0)
    result
else
    -2

2 个答案:

答案 0 :(得分:7)

您可以使用letwhere

执行此操作
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执行类似操作,您可以在其中区分错误类型。