纯这个词在不同的语境中有不同的含义。
函数式编程
当人们谈论 Haskell 是一种纯语言时,他们的意思是它有 referential transparency。也就是说,您可以用它的值替换任何表达式,而不会改变程序的含义。例如,在 Haskell 中:
square :: Int -> Int
square x = x * x
main = print (square 4)
表达式square 4 可以替换为它的值(16),而不会改变程序的含义。另一方面,在这段 Java 代码中:
public int square(int x) {
System.out.println("Done!");
return (x*x);
}
public static void main(String [] args) {
System.out.println(square(4));
}
您不能将 square(4) 替换为其值 (16),因为它会改变程序的含义 - 它不会再将 Done! 打印到标准输出。在 Haskell 中,函数不可能有副作用,例如打印到标准输出或更改内存位置,因此强制引用透明。
请注意,对于纯粹的含义,Lisp 不是纯函数式语言,因为它的函数可能会产生副作用(如果你想挑剔的话,Haskell 不是纯函数式语言,因为unsafePerformIO 的存在,但每个人都知道,如果你曾经使用过这个功能,你就会被送入更恶劣的地狱圈子之一。
当然,在不纯的语言中采用纯的样式总是可能的,许多程序员会这样做是为了更容易推理他们的程序。只是编译器不会强制执行引用透明性,因为它是纯语言。
纯函数式语言的示例包括Haskell、Clean 和Miranda。不纯函数式语言的示例包括OCaml、F# 和Scheme。
面向对象编程
当人们谈论 Smalltalk 或 Ruby 是一种纯面向对象的语言时,他们的意思是对象和原始值之间没有区别。在 Smalltalk 和 Ruby 中,整数、布尔值和字符等值也是对象,因为它们可以接收消息 (Smalltalk) 或具有方法 (Ruby)。例如,你可以这样做
1.to_s
在 Ruby 中,即调用整数 1 的方法,将其转换为字符串。将此与像 Java 这样的“不纯”OO 语言进行比较,其中有对象(它们是类的实例,可以有方法等)和原始值(例如int、double、bool,它们可以'没有方法)。
当一个面向对象语言是纯的时,人们常说“一切都是对象”,这不是严格正确的(例如,if 语句不是对象)而是 is正确地说“每个值都是一个对象”。
纯面向对象语言的示例包括Ruby 和Smalltalk。不纯的面向对象语言的例子包括Java 和C++。