如何在函数式编程中递增变量? [英] How to increment a variable in functional programming?
本文介绍了如何在函数式编程中递增变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在函数式编程语言中递增变量?
例如,我希望这样做:
main :: IO ()
main = do
let i = 0
i = i + 1
print i
预期输出:
1
推荐答案
简单的方法是引入变量名的隐藏:
main :: IO () -- another way, simpler, specific to monads:
main = do main = do
let i = 0 let i = 0
let j = i i <- return (i+1)
let i = j+1 print i
print i -- because monadic bind is non-recursive
打印1
。
仅编写let i = i+1
不起作用,因为let
在Haskell中生成了递归定义-它实际上是方案的letrec
。let i = i+1
右侧的i
指的是左侧的i
,而不是的上级i
。因此,我们通过引入另一个变量j
来分解该方程。
do
表示法中使用一元绑定,<-
。这是可能的,因为一元绑定是而不是递归的。
在这两种情况下,我们都以相同的名称引入new变量,因此";隐藏";旧实体,即使其不再可访问。
如何思考函数性(&Q;)
这里要理解的一件事是,使用纯不可变值的函数式编程(就像我们在Haskell中所做的那样)迫使我们在代码中使时间显式。
在命令性设置中,时间是隐式的。我们更改我们的变量(&Q;)-但任何更改都是顺序的。我们永远不能更改刚才变量,只能更改从现在开始的。
在纯函数式编程中,这只是显式的。最简单的形式之一就是在命令式编程中使用值列表作为顺序更改的记录。更简单的是完全使用不同的变量来表示一个实体在不同时间点的不同值(参见:single assignment和static single assignment form或SSA)。
因此,我们不会更改不能真正更改的内容,而是制作它的增强副本,并将该内容传递出去,用它来代替旧的内容。
这篇关于如何在函数式编程中递增变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文