Data structures 纯函数语言?

Data structures 纯函数语言?,data-structures,functional-programming,Data Structures,Functional Programming,什么是纯函数式语言?什么是纯功能数据结构? 我知道什么是函数式语言,但我不知道“纯”是什么意思。有人知道吗? 谁能给我解释一下吗?谢谢 目前使用的大多数函数式语言并不纯粹是因为它们提供了与现实世界交互的方式。例如,很久以前,Haskell有几个纯变种 纯功能数据=持久数据(即不可变) 纯函数=给定相同的输入总是产生相同的输出,并且不包含副作用或受副作用影响。当函数式程序员提到纯函数的概念时,他们指的是纯函数的概念 引用透明性实际上是关于值替换,而不改变程序的行为 考虑一些将2添加到数字的函数:

什么是纯函数式语言?什么是纯功能数据结构? 我知道什么是函数式语言,但我不知道“纯”是什么意思。有人知道吗?
谁能给我解释一下吗?谢谢

目前使用的大多数函数式语言并不纯粹是因为它们提供了与现实世界交互的方式。例如,很久以前,Haskell有几个纯变种

纯功能数据=持久数据(即不可变)


纯函数=给定相同的输入总是产生相同的输出,并且不包含副作用或受副作用影响。

当函数式程序员提到纯函数的概念时,他们指的是纯函数的概念

引用透明性实际上是关于值替换,而不改变程序的行为

考虑一些将2添加到数字的函数:

let add2 x = x + 2
程序中对
add2 2
的任何调用都可以用
4
值替换,而不改变任何行为

现在考虑把<代码>打印<代码>混合到:

let add2 x =
    print x 
    x + 2
此函数仍然返回与前一个函数相同的结果,但如果不更改程序行为,我们将无法再执行值替换,因为
add2 2
具有将
2
打印到屏幕上的副作用

因此,它在引用上是不透明的,因此是一个不纯的函数

现在我们对纯函数有了一个很好的定义,我们可以将纯函数语言定义为一种几乎只处理纯函数的语言

注意:仍然可以使用纯功能性语言执行效果(例如打印到控制台),但这是通过将效果视为表示要执行的操作的值来实现的,而不是将其视为某些功能中的副作用。这些效应值随后被组合成一组更大的程序行为


然后,纯函数数据结构就是设计用于纯函数语言的数据结构

由于使用函数改变数据结构会破坏这种引用透明度属性,因此每次添加或删除元素时,我们都需要返回一个新的数据结构


有一些特殊类型的数据结构,我们可以有效地实现这一点,从以前的副本中共享大量内存:单链表和各种基于树的结构是最常见的例子,但还有许多其他的例子。

纯函数式语言与现实世界交互绝对没有问题,这是一个破坏性的误解。这类语言并不是通过大多数其他语言使用的副作用函数来实现的。Haskell的IO方法涉及到与真实世界的交互,而不需要使用不纯净的函数。@TheInnerLight-你显然没有客观或上下文地阅读我的答案。IO是附加组件还是核心语法的一部分与SO问题无关。我当然是。你的回答表明,如果一种语言与现实世界互动,它就不能被视为纯粹的功能性语言。我向你解释说,这种推论是错误的。报应性向下投票不会改变这一点。此效果值是否总是属于特殊类型,如Haskell中的
IO
?@ftor是的,您将为此使用特殊类型。它可能是
IO
,就像在Haskell和一些流行的Scala实现中一样,F#使用
Async
实现异步效果,而Purescript使用
Eff
/
Aff
实现同步/异步效果。@如果该函数只执行一个数学函数,而没有其他功能,则为空,它会考虑纯函数吗?在add2中,x不是纯数据结构,对吗?X从2变为4。你能举一个纯数据结构的例子吗?我不太明白。@JeffYan不,
x
没有改变。在这种情况下,
x
绝对可以是一个简单的不可变值,我们不改变它,只返回一个等于
x+2
的新值。我不认为它是一个纯粹的功能数据结构,但是,当我们讨论纯函数数据结构时,我们通常谈论的是许多不可变的值的集合。