纯函数式语言真的能保证不变性吗?
在纯函数式语言中,不能仍然定义一个“赋值”运算符,比如“< - ”,这样命令就像“i< - 3”,而不是直接赋值不可变变量i,会创建整个当前调用堆栈的副本,除了在新调用堆栈中用3替换i,并从该点开始执行新的调用堆栈?鉴于实际上没有数据发生变化,根据定义,这仍然不会被视为“纯功能”吗?当然编译器只是简单地将优化分配给i,在这种情况下,命令式和纯函数之间的区别是什么?
没有找到相关结果
已邀请:
3 个回复
翁茄口霉氖
。这个想法是让违反纯度变得困难,而不是不可能。 实际上,在许多情况下,例如在为C库创建Haskell绑定时,这些机制是非常必要的......通过使用它们,您将从编译器中消除纯度证明的负担并自行处理。 有人建议通过禁止类型系统的这种颠覆来实际保证安全;我不太熟悉它,但你可以在这里阅读它。
芦歉竭皑
。这确实会违反功能纯度,因为每次调用时它都必须返回不同的东西(没有参数)。但是如果函数
,你传递一个自己的函数,它会回调你的函数并将当前堆栈作为参数传递给它?那将是完全可以的。 CallCC的工作方式有点像。
屠创氓读叔
的值似乎已经改变,则复制数据的操作
仍然是必要的操作。 同样,纯函数式语言实现可以覆盖并重用变量到其内容,只要每个修改对程序员是不可见的。例如,只要语言实现可以推断出在任何地方都不需要旧列表,
函数原则上可以覆盖列表而不是创建新列表。