Scala的动机强调了形式语言理论和良好风格?
为什么许多人说使用下划线是Scala中的好习惯并使您的代码更具可读性?他们说动机来自形式语言理论.然而,许多程序员,特别是来自其他语言的程序员,尤其是那些具有匿名功能的程序员,更喜欢不使用下划线,尤其是占位符.
那么下划线的重点是什么?为什么Scala(和om-nom-nom指出的其他一些函数式语言)有下划线?在复杂性和语言理论方面,正式基础是什么,为什么它通常使用它的好风格? 解决方法
语言学
Scala中大多数下划线用法的起源和动机是允许构造表达式和声明,而不需要总是给出一个名称的语言中的每个变量(我的意思是“谓词微积分”中的“变量”,而不是编程).我们一直在自然语言中使用这个,例如我在这个句子中使用“this”引用了前一句中的概念,并且我使用“this”来引用这句话而没有对我的意思产生任何混淆.在自然语言中,这些词通常被称为“代词”,“anaphors”,“cataphors”,所谓的“先行词”或“postcedent”,理解/解除引用它们的过程称为“anaphora”. 算法信息论 如果我们在引用它之前必须用自然语言命名每一个“东西”,类似的每种类型的东西,以便量化它,如在谓词微积分和大多数编程语言中,那么说话将变得极其冗长.正是由于语境,我们可以推断出像“this”,“it”,“that”等词语的意思,我们很容易做到. 那么为什么要限制这种简单,优雅和有效的方式与自然语言进行交流?所以它被添加到Scala中. 如果我们确实试图命名每一个“事物”或“事物的类型”,那么句子会变得如此冗长和复杂,以至于由于它的冗长和冗余符号的引入而变得非常难以理解.你添加到句子中的符号越多,理解就越难理解,这就是为什么它不仅在自然语言中,而且在Scala中也是一种好习惯.事实上,人们可以用Kolmogorov复杂性来形式化这个断言,并证明采用占位符的句子序列的复杂性低于不必要地命名所有内容的句子(除非名称在每个实例中完全相同,但通常没有意义).因此,我们可以最终确定地说,与一些程序员相信,占位符语法更简单,更容易阅读. 它在使用中有一些阻力的原因是,如果一个人已经是程序员,就必须努力重新训练大脑而不是命名所有东西,就像(如果他们记得)他们可能已经学会编码第一个地方需要付出相当大的努力. 例子 现在让我们更正式地看一些特定用途: 占位符语法 表示“它”,“它们”,“那个”,“它们”等(即代词),例如1 lines.map(_.length) 可以读作“将线条映射到它们的长度”,类似地,我们可以将lineOption.map(_.length)读作“将线映射到它的长度”.就复杂性理论而言,这比“对于行中的每个’行’更简单,取’行’的长度” – 这将是lines.map(line => line.length). 当与类型注释一起使用时,也可以被理解为“该”(定冠词). (_: Int) + 1 “将1加到整数” 存在类型 意思是“某种类型”(“某些”代词),例如 foo: Option[_] 意思是“foo是某种类型的选项”. 更高的Kinded类型参数 同样,基本上意味着“某种类型”(“某些”代词),例如 class A[K[_],T](a: K[T]) 可以读作“A级需要一些类型的K ……” 模式匹配通配符 意为“任何东西”或“任何”(代词),例如 case Foo(_) => "hello" 可以被理解为“对于包含任何东西的Foo,返回’你好’”,或“对于包含任何东西的Foo,返回’你好’” 导入通配符 意为“一切”(代词),例如 import foo._ 可以理解为“从foo导入所有内容”. 默认值 现在我把它读作“a”(不定冠词),例如 val wine: RedWine = _ “给我一杯红酒”,服务员应该给你房子红. 下划线的其他用途 下划线的其他用途与本Q& A的要点并不完全相关,但我们对它们进行了简单的讨论. 忽略值/参数/提取 允许我们以明确的“模式安全”方式忽略事物.例如. val (x,_) = getMyPoint 说,我们不会使用第二个坐标,所以当你无法在代码中找到使用时,不需要变得怪异. 导入隐藏 只是一种说“除了”(介词)的方式. 功能应用 例如. val f: String => Unit = println _ 这是一个有趣的,因为它在语言学中有一个确切的类比,即名词化,“使用动词,形容词或副词作为名词短语的头部,有或没有形态转换” – 维基百科.更简单的说,它是将动词或形容词转化为名词的过程. 用于特殊方法名称 纯粹是一种语法,与语言学无关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |