Functional programming 如何使这种操作功能化?

Functional programming 如何使这种操作功能化?,functional-programming,Functional Programming,例如,我们需要实现函数集addToSet(Stack,Object):它接受一个堆栈和一些可以推入堆栈的对象;应将输入对象推入输入堆栈;我们需要它返回一个集合,该集合包含输入堆栈的所有元素以及新对象。如果我们将新对象推入堆栈,我们就违反了。由于某些原因,我们不能在调用此函数之前或之后将新对象推入堆栈(即,在函数外部进行推送)。我们该怎么办 我猜解决方案是先将输入堆栈复制到新堆栈,然后修改新堆栈,最后将结果Set与新堆栈一起返回。你的意见是什么?那么: function Stack pushToS

例如,我们需要实现
函数集addToSet(Stack,Object)
:它接受一个
堆栈和一些可以推入堆栈的对象;应将输入对象推入输入堆栈;我们需要它返回一个
集合
,该集合包含输入堆栈的所有元素以及新对象。如果我们将新对象推入堆栈,我们就违反了。由于某些原因,我们不能在调用此函数之前或之后将新对象推入堆栈(即,在函数外部进行推送)。我们该怎么办

我猜解决方案是先将输入堆栈复制到新堆栈,然后修改新堆栈,最后将结果
Set
与新堆栈一起返回。你的意见是什么?

那么:

function Stack pushToStack(Stack, Object)
function Set stackToSet(Stack)
stackToSet(pushToStack(Stack,Object))

没有更多的副作用。

为什么heck返回一个集合而不是堆栈?这两个问题是完全不同且不兼容的数据结构。@delnan这是一个简单的例子:我对这个问题有一个更复杂的版本,但是如果发布它,没有人会回答它。我倾向于FP:)我的意思是,如果你在一个堆栈上操作,但最终想要一个集合,那很好。但是,有两个独立的函数更有意义:一个是在堆栈上添加元素(返回另一个堆栈),另一个是将堆栈转换为集合。我知道这不是你的全部问题,但是融合这两个操作是如此的毫无意义,以至于我不得不假设你没有正确地分解你的问题。@delnan非常有用的想法打动了我!谢谢。原始版本在这里(附加部分):。假设
pushToStack
没有副作用,这对OP来说并不明显。纯函数编程不允许任何修改(状态更改),函数不能更改现有对象,它只是丢弃旧对象并返回新对象。所以要么你改变规则,要么像我上面写的那样做。您将
pushToStack
一个堆栈a和一个对象O馈入,然后您将获得一个新堆栈a',然后将其馈入
stackToSet
,您将获得一个新集合S。仅此而已!是的,它只是你猜到的
调用pushToStack(origianl_stack,obj)=>(获取顶部带有对象的新堆栈),然后调用stackToSet(biger_stack)=>(获取从biger_stack转换的集合)
如果您使用的语言支持多个返回值,那么您可以将这两个函数合并到一个函数中,并返回它们。但这样的语言不会被称为函数式语言。函数
addToSet(stk,obj)
从功能上讲,实际上是addToSet(stk)=>的组合,返回一个当前函数
f'
,然后以obj为参数调用当前函数
f'