我想知道是否有更好的方法(因为我觉得这有点“糟糕的风格”)来存储/改变Haskell中的值:
foo :: IO ()
foo = do
var <- return 3
var <- if (...)
then
return (var + 3)
else
return (var - 3)
(...)
return ()
答案 0 :(得分:5)
在Haskell中处理更改变量的正确方法是使用函数和递归。要“更改”变量的值,您需要计算新值并使用它调用某个函数。然后调用的函数将获得该值作为其参数的新值。通常这是一个递归调用。以下阶乘的示例。
命令式伪代码:
<amp-img src="" alt="" />
翻译成Haskell:
def factorial(n)
a=1
for i = 1 to n
a = a*i
return a
请注意,我们用递归调用替换变量的变异。这是惯用的Haskell中的阶乘:
factorial n = go 1 1 where
go a i | i <= n = go (a*i) (i+1)
go a i | i > n = a
通常人们根本不需要改变变量值。
最后应该注意到,您实际上并没有更改变量factorial n = product [1..n]
的值,因为您的代码正在执行以下操作:
var
所以你只是以一种非常迂回的方式做我上面描述的事情。