蒯因与引用透明

转载 2015年07月10日 15:32:15

蒯因又称奎因,美国哲学家,逻辑学家,逻辑实用主义的代表,与罗素齐名,强调系统的、结构式的哲学分析,主张把一般哲学问题置于一个系统的语言框架内进行研究。

蒯因从逻辑的观点出发,把语言分析作为哲学研究的核心内容,这就为哲学的语言转向划上了一个圆满的句号:自蒯因哲学起,当哲学家开始讨论哲学问题的时候,都需要首先考察所要讨论的命题的意义,而不会像传统哲学家那样依然专注于对世界存在的思考。

蒯因强调以严格精确的形式语言表达我们的思想,蒯因这一逻辑应用在我们编程语言中,演化成了各种面向对象或面向函数编程的原则。

下面我们谈谈函数副作用的问题,也称边界问题,降低甚至消灭副作用已经成为我们编程的一个重要原则,不要让一个方法或函数执行主要功能时,会产生其他意想不到的次要功能,这些额外功能不是我们要求的,称为副作用。

更严格地消灭副作用方式是引用透明(referentially transparent),这是面向函数范式FP中的一个术语,也是FP语言如Scala等相比Java特色所在。

为什么他们称为引用透明Referentially transparent一文中谈到:

“引用透明”(指称透明)这个概念来自于蒯因(Quine)的关于自然语言哲学。看看下面语句:BanQ比老鼠大, 如果把"BanQ"去除,留个空白在那里,显然变成:“??? 比老鼠大”。哲学家认为这是一个Context场景,通过填补场景中的空白,你得到了这个语句真实含义。

再次想一下北京这个城市,它是一个thing,有许多方式可以指称或引用(refer)它,“中国首都”或“在经纬XXX度的城市”。

因此,“引用透明”(referentially transparent)中的“引用referentially”这个词语的含义是在谈论这样一个事实:北京这个事物(thing)有很多名称,有很多途径来表达指称这个事物。

“引用透明”(referentially transparent)中“透明transparent”含义是“没有什么不同”,“都是一样”。

蒯因认为: 如果我们能够用不同的名称替代上面语句中的空白,但是没有改变任何意思,总是得到同样的结果,那么这个场景Context就是“引用透明”的。

如:
[北京]比老鼠大 是真;
[中国首都]比老鼠大 是真
[在经纬XXX度的城市]比老鼠大 是真

这些命题的真正含义不会因为我们选择不同的引用或指称名称而受到影响。我们就可以认为场景"??? 比老鼠大"是引用透明的。

与引用透明相反,蒯因认为存在引用不透明( REFERENTIALLY OPAQUE),名称的改变对于整个语句意思非常重要。

比如:??? 有9个字符。那么:[北京]有9个字符 是伪的。

这样场景“??? 有9个字符” 的含义因为名称指称(name/refernce)不同而不同。

罗素 蒯因等代表的形式逻辑是数学或编程语言的元语言,在数学中,所有函数都是引用透明的,比如sin(x),无论如何调用,结果只依赖x值,或者说:对于一个特定的x值,无论怎么调用这个函数得到都是同一个结果。

因为国内很多人只知道数学,而不知道数学后面的哲学与形式逻辑,就把我们编程语言中的这些约束和数学划上关系,实际上真正有联系的是数学背后的形式逻辑,或称符号逻辑。

对于编程语言,引用透明的含义可以表达为:函数的输出只依赖于其输入,引用透明就没有副作用,也无需指定前后运行顺序,比如:

int getResult(x){
   return x;
}

是一个引用透明无副作用的方法函数,而:
int getResult(x){
   return x + g;
}

则是引用不透明,因为getResult结果不但依赖x,还依赖g值。

那么g值是什么呢?一般是这个方法所在类的属性字段,如完整是如下:
public Class A{
  int g;

  int getResult(x){
     return x + g;
  }
}


很显然,含有属性状态g的类A,我们称为有状态类,也就是说:有状态的类都不是引用透明,都是引用不透明的。

引用透明概念由于本源起源于形式逻辑,而数学也建立在形式逻辑基础上,很显然,关系代数中的幂等函数含义与引用透明概念是一致的。

引用透明或幂等函数都是多次调用都会得到同样的结果,而且这个结果只依赖输入,不依赖其他值,这就为我们进行并行或异步计算提供了可能,也会分布式架构的粒度切分提供了可能,我们如果把一个引用不透明的有状态服务切分为引用透明无状态服务,那么无疑性能和可扩展性Scalable大大提高了。

引用透明虽然是编程范式中一个原则,实际也是性能设计可扩展性中的一个原则,这就完美体现了良好的性能和良好的编程习惯是密切不可分的。

转载出处:http://www.jdon.com/42422

函数的引用透明性(referential transparency)

1. 基础初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数。在数学函数中 y=f(x)y=f(x),一个输入值有固定的输出值。例如,无论计算多少次,si...

【引用】Qt中设置窗口的透明

QT 窗体透明 分类: QT美化动态化 2011-11-30 20:04 802人阅读 评论(3) 收藏 举报 【引用】Qt中设置窗口的透明   Qt ...

VC6.0用GDI+重绘透明按钮

  • 2017年12月08日 14:28
  • 944KB
  • 下载

opencv 实现PNG的透明背景

转自:http://www.opencv.org.cn/forum.php?mod=viewthread&tid=32871 void overlayImage(const cv::Mat &b...

Oracle通过透明网关连接DB2

  • 2017年11月08日 16:59
  • 14KB
  • 下载

透明状态栏(StatusBar)的全适配

透明状态栏(StatusBar)的全适配状态栏指定android手机上顶部显示手机状态信息的位置。透明状态栏是android 自4.4开始新加入的功能,他可以是状态栏根据我们自己想要的颜色进行定义,使...
  • lisdye2
  • lisdye2
  • 2016年05月06日 14:50
  • 6428

SSM透明H5博客登录注册页面

  • 2017年11月17日 15:42
  • 17.19MB
  • 下载

安卓版透明屏幕动态壁纸apk

  • 2017年08月17日 17:52
  • 1.54MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:蒯因与引用透明
举报原因:
原因补充:

(最多只允许输入30个字)