- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
换句话说,是什么让语言变得纯粹?
例如,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 , Clean和 Miranda .不纯函数式语言的示例包括 OCaml , F#和 Scheme .
当人们谈论 Smalltalk 或 Ruby 是一种纯面向对象的语言时,他们的意思是对象和原始值之间没有区别。在 Smalltalk 和 Ruby 中,整数、 bool 值和字符等值也是对象,因为它们可以接收消息 (Smalltalk) 或具有方法 (Ruby)。例如,你可以这样做
1.to_s
在 Ruby 中,即调用整数 1
的方法将其转换为字符串。将其与像 Java 这样的“不纯”OO 语言进行比较,其中有对象(类的实例,并且可以有方法等)和原始值(例如 int
、double
, bool
,不能有方法)。
当 OO 语言是纯语言时,人们常说“一切都是对象”,这并非严格意义上的正确(例如,if 语句不是对象)但是正确地说“每个值都是一个对象”。
关于haskell - 在编程语言和范例的上下文中, "Pure"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11607927/
我是一名优秀的程序员,十分优秀!