Haskell中的变量处理

Haskell中的变量处理,haskell,Haskell,我想知道是否有更好的方法(因为我觉得这有点“糟糕的风格”)在Haskell中存储/更改值: foo :: IO () foo = do var <- return 3 var <- if (...) then return (var + 3) else return (var - 3) (...) return () foo::IO() foo=do var在H

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

foo :: IO ()
foo = do

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

  (...)

  return ()
foo::IO()
foo=do

var在Haskell中处理变量变化的正确方法是使用函数和递归。要“更改”变量的值,您需要计算新的值并用它调用某个函数。然后,被调用的函数将获得该新值作为其参数。通常这是一个递归调用。下面的阶乘示例

命令伪代码:

def factorial(n)
  a=1
  for i = 1 to n
    a = a*i
  return a
翻译成哈斯克尔:

factorial n = go 1 1 where
  go a i | i <= n = go (a*i) (i+1)
  go a i | i >  n = a
通常人们根本不需要改变变量的值

最后,应该注意的是,您实际上并没有更改变量
var
的值,因为您的代码执行了如下操作:

return 3 >>= \var ->
(... return (var +3)) >>= \var ->
..,

因此,您只是以一种非常迂回的单一方式来执行我上面描述的操作。

处理Haskell中变量变化的正确方法是使用函数和递归。要“更改”变量的值,您需要计算新的值并用它调用某个函数。然后,被调用的函数将获得该新值作为其参数。通常这是一个递归调用。下面的阶乘示例

命令伪代码:

def factorial(n)
  a=1
  for i = 1 to n
    a = a*i
  return a
翻译成哈斯克尔:

factorial n = go 1 1 where
  go a i | i <= n = go (a*i) (i+1)
  go a i | i >  n = a
通常人们根本不需要改变变量的值

最后,应该注意的是,您实际上并没有更改变量
var
的值,因为您的代码执行了如下操作:

return 3 >>= \var ->
(... return (var +3)) >>= \var ->
..,

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

实际上你根本不改变变量,你创建了一个范围更近的新变量,但这对于循环来说会非常失败。
让var=if(…)然后6 else 0
。。。?如果这不令人满意,您可能应该修改您的激励示例来说明原因。实际上,您根本不改变变量,而是创建了一个范围更近的新变量,但对于循环,这将大大失败。
让var=If(…)然后6 else 0
。。。?如果这不令人满意,你应该修改你的激励例子来说明原因。