处理Haskell中的变量

时间:2018-03-25 09:14:55

标签: haskell

我想知道是否有更好的方法(因为我觉得这有点“糟糕的风格”)来存储/改变Haskell中的值:

foo :: IO ()
foo = do

  var <- return 3
  var <- if (...)
              then
                return (var + 3)
         else
           return (var - 3)

  (...)

  return ()

1 个答案:

答案 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

所以你只是以一种非常迂回的方式做我上面描述的事情。