2008-11-13 27 views
5

在面向對象的範式中,我會在使用面嚮對象語言開始實現它之前創建一個對象/概念模型。有什麼像功能模型?

函數式編程中有沒有與對象模型並行的東西?它被稱爲功能模型嗎?或者我們在語言的一個實現它之前創建兩個範例相同的概念模型..

是否有文章/書籍在那裏我可以閱讀有關的情況下,存在功能模型?

或以不同的方式表達......即使我們使用函數式編程語言,我們是否會從對象模型開始?

回答

6

其實是有的。有一種基於抽象數據類型(稱爲代數規範)的函數式語言規範。他們的行爲在某些方面與對象的行爲非常相似,但是這些構造是邏輯的和數學的,並且像功能構造一樣是不可變的。

這是一個在布宜諾斯艾利斯大學的算法與數據結構類使用的特定功能規範語言有發電機,觀察員和其他操作。 生成器是既是實例又是數據類型的可能組合的表達式。 例如,對於二叉樹(ADT bt),我們有空節點和二進制節點。因此,我們將有發電機:

-nil 
-bin(left:bt, root: a, right:bt) 

其中左邊是一個BT的一個實例,根是一個通用的值,右邊是另一種BT。因此,nil是bt的有效形式,但bin(bin(nil,1,nil),2,nil)也是有效的,表示具有值爲2的根節點的二叉樹,左子節點值爲1,以及一個空子節點。

所以該說的函數,計算樹的節點數,你界定ADT的觀察者,並且定義了一套公理其映射到每個發電機。 因此,例如:

numberOfNodes(nil) == 0 
numberOfNodes(bin(left,x,right))== 1 + numberOfNodes(left) + numberOfNodes(right) 

這與使用操作的遞歸定義的優勢,並且具有可以使用一種叫做結構歸納證明你的規範是正確的越多,正式有趣的屬性(是的,你證明你的算法會產生正確的結果)。

這是很少見到學術界之外的相當的學術話題,但它是值得的,以獲得方案設計的見解,可能會改變你對算法和數據結構的方式。 正確參考書目,包括:

Bernot,G.,Bidoit,M.,和克納皮克,T. 1995觀測規格和不可分辨的假設。 Theor。 COMPUT。科學。 139,1-2(Mar. 1995),275-314。 DOI = http://dx.doi.org/10.1016/0304-3975(94)00017-D

Guttag,J.V.和Horning,J.J.1993。 Larch:正式的語言和工具 規範。施普林格出版社新 紐約,Inc.的抽象和 規範軟件開發, 芭芭拉里氏Ÿ約翰·加塔,MIT 出版社,1986年。

代數 規格1.方程的基礎和初始 語義。 H.埃裏格ŸB.馬爾 施普林格出版社,柏林,海德堡, 紐約,東京,德國,1985年

相應鏈接: http://www.cs.st-andrews.ac.uk/~ifs/Resources/Notes/FormalSpec/AlgebraicSpec.pdf http://nms.lcs.mit.edu/larch/pub/larchBook.ps

這是一個有趣的赫克話題。

+1

如果你到編程與遞歸數據類型一起看看「用香蕉,透鏡,信封和帶刺線進行函數式編程」[1]。這是非常有趣的,並與我很多。 [1]:= http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.125 – Tetha 2008-12-02 06:13:34

1

在OO和FP範例中,您都會形成您的域模型(您正在解決的問題),然後在程序中創建對象以鏡像域對象。有一些差異,因爲程序對象如何鏡像域對象受到您使用的範例和語言的影響。一些例子(在Haskell):