函数式编程和 J 编程语言 【已翻译100%】(1/3)

摘要:

这里是一个使用J编程语言作为例子对函数式编程所做的一个简要介绍. 用几个示例来向您展示函数式语言令人影响深刻的能力,以及它们在数学领域的应用. 讨论了使用J语言作为数学符号替代品.

主要领域:函数式编程,J编程语言.

关键词:函数式编程,J编程语言.

1 介绍

计算式是一种用来解释语言的机制. 计算机所解释 (执行特定动作的) 的语句,中所周在叫做计算机的机器语言. 因而它跟随关于计算机组织的研究,被关联到有关计算机语言的组织的研究.

计算机语言可以用很多种方式分类。而机器语言直接为计算机所解释。更高级别的计算机语言则往往在某种程度上独立于特定的计算机,并且在程序可能被解释(执行)之前需要翻译(编译)成机器语言。语言也依照系统所采用的运算基础模型,而被分成 命令解析型 和 可应用型 两类.

抽象是计算领域中的一个重要概念. 一般而言,较高级别的语言更具抽象性. 抽象的关键工具是名称的运用. 一些复杂的项目给定了一个名称. 这个名称随后被用来作为一个另外一个项目的构造块,另外这个项目也会被命名,如此等等. 抽象是管理计算机程序的一种重要工具.

2, 函数编程是什么

函数式编程不仅仅使用功能的编程语言。函数式编程的方法在实现方式上不同与命令式编程。功能编程范式涉及可靠地派生程序,分析程序、证明程序的正确性。这是因为函数式编程语言都基于从数学思想在,而数学工具可能需要程序推导、 分析和证明这样的过程。

函数式编程语言 (应用语言) 至少在以下方式不同于传统的编程语言 (命令式语言) :

2.1 名称的使用

在命令式语言中,名称被关联到其值(状态)在计算过程中会发生变化的内存单元.

在应用型语言中,名称被关联到存储在内存中的项目. 一旦在内存中被创建出来, 这个项目就再也不会被改变. 名称会被赋值给项目,只在这个项目需要在稍后的某个时间点被引用时,被存储到内存中. 被存储在内存中的项目作为参数用于后续函数式计算过程的函数中.

例如,在C(一种命令式语言)中,我们可能会这样写:

int foo;
...
   foo = 4;

此例中我们将名称foo同一个大小足以容纳一个整形的特定内存单元相关联. 它在那一刻的状态是不确定的. 后来foo被赋值为4, 如示例,其状态就变成了4.

在J(一种应用型语言),我们可能会这样写:

foo =: 4

一个项目 4 在内存中被创建,而名称foo被赋值到那个项目.

请注意在C中我们会说值4被赋值给了foo,而在J中我们会说名称foo被赋值给了4. 这一差别是微妙的. 使用命令式语言的关注点在于内存单元,还有程序执行期间他们的状态如何改变.

使用函数式语言的关注点在于内存中的项目. 一个项目一旦创建,它就再也不会被改变. 名称在它们提供对某些被存储在内存中的东西的引用,而不是一个普通的数据,这种意义上,更具抽象性. 函数被应用到项目来产生结果项目,而这一过程将重复直至运算完成.

2.2 状态改变

在命令式语言中,计算设计到被命令内存单元的状态改变.

例如,考虑一下底下的的C (一种命令式语言) 程序:

#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{ int sum, count, n;
  count = 0;
  sum = 0;
  while (1 == scanf("%d\n", &n))
   { sum = sum + n;
     count++;
   }
  printf("%f\n", (float)sum / (float)count);
  exit(0);
}

程序会从标准输入流中读入一些整型值,计算这些值的平均值,并将这个平均值写到标准的输出流。在平均值计算的一开始,内存单元count和sum的状态被初始化为0. 内存单元n针对每一个个整形读取做出改变. 另外,sum的状态会累加每一个读取的整形数,而count的状态会递增读取的整形数的个数. 一旦所有的整形数读取完了,它们的sum的累加值和计数也就知晓,那样平均值就可以被计算出来了.

为了使用C的平均值计算程序,人们必须编译这个程序.

[jhowland@Ariel jhowland]$ make ave
cc     ave.c   -o ave
[jhowland@Ariel jhowland]$ echo "1 2 3" | ave
2.000000
[jhowland@Ariel jhowland]$

使用函数式语言,计算涉及到函数应用程序. 复杂的计算需要一个应用程序的结果作为另外一个应用程序的参数. 这个过程被称作功能性组合. 函数式语言可能会有特殊的组合规则被应用与程序中. 基于数学函数思想的函数式语言,从数学中获得了不少的好处. 数学的技术和工具就可以被用于 (推导,简化,转换,以及证明正确性) 程序的有关方面.

我们先看下面这个J(一种应用语言)程序的例子:

+/ % #

这个程序计算来自标准输入的一列数字的平均值。结果(因为没有给结果指定参数名)使用标准输出显示。

这个J 平均值程序有几个有趣的特点.

  • 程序简洁.
  • 程序存在没有命名的内存单元.
  • 程序不分配任务.
  • 数字不是挨个处理的。
  • 该算法被表示没有参考的数据.

使用J 平均值程序时,你应该把程序和数字表放在一个J计算机(解释器)的标准输入流中。

[jhowland@Ariel jhowland]$ echo "(+/ % #) 1 2 3" | jconsole
   (+/ % #) 1 2 3
2
   [jhowland@Ariel jhowland]$

这个J 平均值程序包含三个功能。

  • +/ 加法
  • % 除法
  • 计数

当一个三功能的程序被应用到一个单一的参数 ,y,则下列组成的交叉规则被使用。

(f g h) y = (f y) g (h y)

在这个J 平均值程序中, f是功能+ / ,表示相加;g是功能% ,表示相除;#是计数功能,计算元素列表中的元素的个数。

J求平均值的程序需要更多解释。/ (insert)是一个函数,它的作用是使两个参数的函数(二价元素)可用,它的返回值是一个重复获取导出函数参数列表中参数的函数,。例如,+/调用一个函数计算它的参数列表中的参数之和。*/导出一个函数计算它的参数列表中的参数。许多函数式语言允许在导出函数中设定返回值为函数类型。然而多数命令式语言却没有这个功能。

例如,调用导出函数 +/可以计算它的参数列表之和,*/计算参数列表之积。

2.3 表达式

函数式语言专门处理产值表达式。通常情况下,一个表达式产生一个值。

命令式语言使用语言结构(如赋值)——在计算过程中,被用来去描述指定内存单元的状态变化,如 C 中的 while 循环。这样的语言中包含很多不产生任何值的语句,以及一些对其他条目产生副作用的语句,如修改其他条目的值。

2.4 副作用

命令式语言可能会有产生副作用的语句。如,在C语言写的平均值程序中包含count++;这样一条语句,该语句引用了count的值(这个平均值程序并没有用到这个引用),并将它的值增1。这个C语言版的程序依赖于这个副作用。

纯函数式的语言没有副作用。

时间: 2024-09-29 15:02:25

函数式编程和 J 编程语言 【已翻译100%】(1/3)的相关文章

函数式编程和 J 编程语言 【已翻译100%】(2/3)

3 为什么要学习函数式编程 函数式编程之所以重要有以下原因: 3.1 可任意赋值 函数式语言允许程序不事先分配内存.结构化的命令式语言(没有goto语句)使得程序容易派生,便于理解和追踪.类似的,assignment-free函数语言也有相同的优点. 3.2 抽象层次高 函数式语言提倡使用更高层次的抽象.例如,函数可以作为函数调用的返回值.函数可以像数据一样被操纵.现存的函数可以被修改,也可以联合组成新的函数.函数式编程包含大量的工作单元而很少使用个体声明.算法可以被直接实现而不引用任何数据.

函数式编程和 J 编程语言 【已翻译100%】(3/3)

5.2.1 实验 考虑一个实验,评估工作站上执行fibonacci需要多长时间.先估计fib_work 100,尽管上面已经给出递归过程的定义,但有必要给出一个迭代过程的定义以便于评估.考虑下面的函数定义: fib_work_iter =: monad def 'fib_iter 1 1 , y.' fib_iter =: monad define ('a' ; 'b' ; 'count') =. y. if. count = 0 do. b else. fib_iter (1 + a + b)

用 90 行 Haskell 代码实现 2048 游戏 【已翻译100%】

上个星期赖斯大学的MOOC 计算的规则 公开课在 Coursera 上开讲啦. 从第一周的材料来看,看起来它有了他们之前的课程 Python中的交互式编程介绍 所有优良的东西: 演示文稿做的很不错,也有大量的支持可用, 而布置的作业也很有趣. 第一个作业就是编写 2048 游戏的逻辑. 鉴于其设计中的根本性缺陷,我并不认为2048特别的有趣. 首先,你并不能在某个地方取得游戏的胜利. 其次,最有希望的游戏策略使得其玩起来相当的繁琐,而且最大的乐趣并不是自己的游戏技能而是随机数生成器制造的幸运连胜

Scala 比 Java 还快? 【已翻译100%】

通常Scala被认为比Java要慢,特别是用于函数式编程时.本文会解释为什么这个被广泛接受的假设是错误的. 数据验证 编程中一个常见的问题是数据验证.即我们要确保所有得到的数据处于正确的结构中.我们需要从安全的,编译器验证的数据中找到不安全的外部输入.在一个典型的WEB应用中,你需要验证每个请求.很明显这会影响你的应用的性能.在本文中我将会比较处理这个问题的两种极不相同的解决方案.Java的Bean验证API和来自play的统一验证API.后者是一种更为函数式的方法,它具有不变性和类型安全的特性

wxWidgets GUI 编程介绍 【已翻译100%】

导论 wxWidgets 是C++的跨平台开发框架.它由 Julian Smart 于1992年在爱丁堡大学人工智能应用研究院发起的,自那之后,该框架分发到了众多平台之上. 本文旨在引导初学者安装所需资源并以Code::Blocks作为IDE使用wxWidgets开发一个单应用程序. 什么是wxWidgets wxWidgets 是一系列C++库,它遵循多平台GUI开发框架的设计规则.它有类似于MFC易于使用的API.把它和特定的库链接并编译,可是你的应用程序与目标平台的界面相似.wxWidge

从 C++ 到 Objective-C 的快速指南 【已翻译100%】

**简介 ** 当我开始为iOS写代码的时候,我意识到,作为一个C++开发者,我必须花费更多的时间来弄清楚Objective-C中怪异的东西.这就是一个帮助C++专家的快速指南,能够使他们快速的掌握Apple的iOS语言. 请注意这绝不是一个完整的指南,但是它让你避免了阅读100页的手册.除此之外,我知道你喜欢我的写作风格. 背景 需要C++的技能,我会比较C++和Objective-C的东西.此外,COM编程也是有用的,因为Objective-C有类似于IUnkown的东西,因此基础的COM编

Swift 在对 Objective-C 改进的 6 个方面 【已翻译100%】

在 Atomic Object 的安娜堡办公室,我们做了一个观看2014年的WWDC主题演讲,毫不夸张地说,当Swift宣布的时候,我们感到十分激动.Swift,苹果正在推进的一个更现代的编程语言.我很高兴能获得先机并开始用它开发. 在这篇博文中,我将重点介绍Swift的几个语言特性,这将使开发者的工作更加轻松. Objective-C语言的问题 当一个开发者申请一个关于Atomic Object的新职位时,我们会给他填写一个(GTKY) Getting To Know You的表.这个表要求填

如何雇一个牛逼的 Node.js 开发者 【已翻译100%】

初创公司是我的激情所在,而我干的也是管理一群雄心壮志的开发人员.我工作在Strongloop,并且已经在很多初创公司待过.初创公司在雇佣问题上有它独特的挑战----预算紧,期限近.加上要使用开源框架进行开发,而且还是相对年轻的框架,如Node.js,这一切使得雇佣一个合适的团队成为了一种巨大的挑战. 正如所有新兴并被快速采用的技术框架一样,一开始的挑战就是给你的技术团队增加高效的人才资源.在快速得出关于把 Javascript 开发变成 Node.js 工厂的结论之前,让我们先来看看关于 Nod

SQLite4 的设计 【已翻译100%】

1.0 内容提要 1.SQLite4 是一个放在库中的紧凑的,自包含的,零维护的的ACID数据库引擎, 像SQLite3一样, 但具有改进的接口和文件格式. 2.运行时环境封装到了一个对象之中. 3.使用了一个很不错的键值对存储引擎: 一个独立的大型键空间 - 不是SQLite3中那种每个表单独的键空间和索引. 2.按字典顺序的键排序. 3.多个存储引擎,可在运行时互换. 4.默认在磁盘上的存储殷勤使用了一个日志结构的合并数据库. 4.表的PRIMARY KEY真正被用作存储引擎的键. 5.可以