天天看點

函數式程式設計和 J 程式設計語言 【已翻譯100%】(1/3)計數

摘要:

這裡是一個使用j程式設計語言作為例子對函數式程式設計所做的一個簡要介紹. 用幾個示例來向您展示函數式語言令人影響深刻的能力,以及它們在數學領域的應用. 讨論了使用j語言作為數學符号替代品.

主要領域:函數式程式設計,j程式設計語言.

關鍵詞:函數式程式設計,j程式設計語言.

計算式是一種用來解釋語言的機制. 計算機所解釋 (執行特定動作的) 的語句,中所周在叫做計算機的機器語言. 因而它跟随關于計算機組織的研究,被關聯到有關計算機語言的組織的研究.

計算機語言可以用很多種方式分類。而機器語言直接為計算機所解釋。更進階别的計算機語言則往往在某種程度上獨立于特定的計算機,并且在程式可能被解釋(執行)之前需要翻譯(編譯)成機器語言。語言也依照系統所采用的運算基礎模型,而被分成 指令解析型 和 可應用型 兩類.

抽象是計算領域中的一個重要概念. 一般而言,較進階别的語言更具抽象性. 抽象的關鍵工具是名稱的運用. 一些複雜的項目給定了一個名稱. 這個名稱随後被用來作為一個另外一個項目的構造塊,另外這個項目也會被命名,如此等等. 抽象是管理計算機程式的一種重要工具.

函數式程式設計不僅僅使用功能的程式設計語言。函數式程式設計的方法在實作方式上不同與指令式程式設計。功能程式設計範式涉及可靠地派生程式,分析程式、證明程式的正确性。這是因為函數式程式設計語言都基于從數學思想在,而數學工具可能需要程式推導、 分析和證明這樣的過程。

函數式程式設計語言 (應用語言) 至少在以下方式不同于傳統的程式設計語言 (指令式語言) :

在指令式語言中,名稱被關聯到其值(狀态)在計算過程中會發生變化的記憶體單元.

在應用型語言中,名稱被關聯到存儲在記憶體中的項目. 一旦在記憶體中被建立出來, 這個項目就再也不會被改變. 名稱會被指派給項目,隻在這個項目需要在稍後的某個時間點被引用時,被存儲到記憶體中. 被存儲在記憶體中的項目作為參數用于後續函數式計算過程的函數中.

例如,在c(一種指令式語言)中,我們可能會這樣寫:

此例中我們将名稱foo同一個大小足以容納一個整形的特定記憶體單元相關聯. 它在那一刻的狀态是不确定的. 後來foo被指派為4, 如示例,其狀态就變成了4.

在j(一種應用型語言),我們可能會這樣寫:

一個項目 4 在記憶體中被建立,而名稱foo被指派到那個項目.

請注意在c中我們會說值4被指派給了foo,而在j中我們會說名稱foo被指派給了4. 這一差别是微妙的. 使用指令式語言的關注點在于記憶體單元,還有程式執行期間他們的狀态如何改變.

使用函數式語言的關注點在于記憶體中的項目. 一個項目一旦建立,它就再也不會被改變. 名稱在它們提供對某些被存儲在記憶體中的東西的引用,而不是一個普通的資料,這種意義上,更具抽象性. 函數被應用到項目來産生結果項目,而這一過程将重複直至運算完成.

在指令式語言中,計算設計到被指令記憶體單元的狀态改變.

例如,考慮一下底下的的c (一種指令式語言) 程式:

程式會從标準輸入流中讀入一些整型值,計算這些值的平均值,并将這個平均值寫到标準的輸出流。在平均值計算的一開始,記憶體單元count和sum的狀态被初始化為0. 記憶體單元n針對每一個個整形讀取做出改變. 另外,sum的狀态會累加每一個讀取的整形數,而count的狀态會遞增讀取的整形數的個數. 一旦所有的整形數讀取完了,它們的sum的累加值和計數也就知曉,那樣平均值就可以被計算出來了.

為了使用c的平均值計算程式,人們必須編譯這個程式.

使用函數式語言,計算涉及到函數應用程式. 複雜的計算需要一個應用程式的結果作為另外一個應用程式的參數. 這個過程被稱作功能性組合. 函數式語言可能會有特殊的組合規則被應用與程式中. 基于數學函數思想的函數式語言,從數學中獲得了不少的好處. 數學的技術和工具就可以被用于 (推導,簡化,轉換,以及證明正确性) 程式的有關方面.

我們先看下面這個j(一種應用語言)程式的例子:

這個程式計算來自标準輸入的一列數字的平均值。結果(因為沒有給結果指定參數名)使用标準輸出顯示。

這個j 平均值程式有幾個有趣的特點.

程式簡潔.

程式存在沒有命名的記憶體單元.

程式不配置設定任務.

數字不是挨個處理的。

該算法被表示沒有參考的資料.

使用j 平均值程式時,你應該把程式和數字表放在一個j計算機(解釋器)的标準輸入流中。

這個j 平均值程式包含三個功能。

+/ 加法

% 除法

當一個三功能的程式被應用到一個單一的參數 ,y,則下列組成的交叉規則被使用。

在這個j 平均值程式中, f是功能+ / ,表示相加;g是功能% ,表示相除;#是計數功能,計算元素清單中的元素的個數。

j求平均值的程式需要更多解釋。/ (insert)是一個函數,它的作用是使兩個參數的函數(二價元素)可用,它的傳回值是一個重複擷取導出函數參數清單中參數的函數,。例如,+/調用一個函數計算它的參數清單中的參數之和。*/導出一個函數計算它的參數清單中的參數。許多函數式語言允許在導出函數中設定傳回值為函數類型。然而多數指令式語言卻沒有這個功能。

例如,調用導出函數 +/可以計算它的參數清單之和,*/計算參數清單之積。

函數式語言專門處理産值表達式。通常情況下,一個表達式産生一個值。

指令式語言使用語言結構(如指派)——在計算過程中,被用來去描述指定記憶體單元的狀态變化,如 c 中的 while 循環。這樣的語言中包含很多不産生任何值的語句,以及一些對其他條目産生副作用的語句,如修改其他條目的值。

指令式語言可能會有産生副作用的語句。如,在c語言寫的平均值程式中包含count++;這樣一條語句,該語句引用了count的值(這個平均值程式并沒有用到這個引用),并将它的值增1。這個c語言版的程式依賴于這個副作用。

純函數式的語言沒有副作用。

繼續閱讀