Haskell中的变量处理
我想知道是否有更好的方法(因为我觉得这有点“糟糕的风格”)在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
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
。。。?如果这不令人满意,你应该修改你的激励例子来说明原因。