gpt4 book ai didi

haskell - 在编程语言和范例的上下文中, "Pure"是什么意思?

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:10 24 4
gpt4 key购买 nike

换句话说,是什么让语言变得纯粹?

例如,Smalltalk 被认为是一种纯面向对象的语言。 Haskell 和 Lisp 可以说是纯函数式语言。

当我们说纯粹时,这是否意味着它们不能用于其他编程范式(这与事实相去甚远),或者是否意味着它们被设计用于“纯粹”的 X 范式?

最佳答案

纯粹这个词在不同的上下文中有不同的含义。

函数式编程

当人们谈论 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));
}

你不能用它的值 (16) 替换 square(4) 因为它会改变程序的意义 - 它不会再打印 Done! 到标准输出。在 Haskell 中,函数不可能有副作用,例如打印到标准输出或更改内存位置,因此强制执行引用透明性。

请注意,对于纯粹的这种含义,Lisp 不是一种纯函数式语言,因为它的函数可能有副作用(如果你想挑剔的话,Haskell 不是一种纯函数式语言,因为unsafePerformIO 的存在,但每个人都知道,如果您使用该函数,您将陷入更恶劣的 hell 圈之一)。

当然,在不纯的语言中采用纯风格总是有可能的,许多程序员会这样做是为了更容易推理他们的程序。只是引用透明性不是由编译器强制执行的,因为它是在纯语言中。

纯函数式语言的例子包括 Haskell , CleanMiranda .不纯函数式语言的示例包括 OCaml , F#Scheme .

面向对象编程

当人们谈论 Smalltalk 或 Ruby 是一种纯面向对象的语言时,他们的意思是对象和原始值之间没有区别。在 Smalltalk 和 Ruby 中,整数、 bool 值和字符等值也是对象,因为它们可以接收消息 (Smalltalk) 或具有方法 (Ruby)。例如,你可以这样做

1.to_s

在 Ruby 中,即调用整数 1 的方法将其转换为字符串。将其与像 Java 这样的“不纯”OO 语言进行比较,其中有对象(类的实例,并且可以有方法等)和原始值(例如 intdouble, bool,不能有方法)。

当 OO 语言是纯语言时,人们常说“一切都是对象”,这并非严格意义上的正确(例如,if 语句不是对象)但正确地说“每个值都是一个对象”。

纯面向对象语言的例子包括RubySmalltalk .不纯的面向对象语言的示例包括 JavaC++ .

关于haskell - 在编程语言和范例的上下文中, "Pure"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11607927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com