Parser Combinators in Java

上週看了一點點 Spark 的書籍(我買的是這本最厚的書《大數據分析處理:Spark技術、應用與性能優質化》),想起前陣子造訪許多家公司,都說需要會操作 Spark ,講得好像很特別,但仔細一看, Spark RDD 就是一堆準備做 Lazy evaluation 的東西,也就是說 Spark 應該是類似把 lazy evaluation 的東西銜接起來,其實也是 map-reduce 。

Spark RDD (Resilient Distributed Dataset) 看起來很像普通的物件生產:例如,

var lines = spart.textFile("/path/to/file")
var fr = lines.first()

以上的 var lines ,其實意思是一個「動作」物件。 Spark RDD 可以是「動作」物件 (aciton) ,或者「轉換程序」物件 (transformation) 。而轉換程序與動作前後連貫起來,就是 map-reduce 的形式。

於是,我的感想是:即使物件導向語言系統是名詞的世界,而函數語言系統是動詞的世界,不過,像 Haskell 語言的資料定義格式,也跟函數定義格式相同,都是把資料名稱、函數名稱、參數等等,放在適當的位置 (Justaposition) 。而以 Java 來說,物件生產,也可以看成是製造出一些 lazy evaluation 的 東西(「函數」都在物件的身上,而物件是它的方法的參數。)。

因此我試著用 Java 實作 Graham Hutton 的 functional programming 論文 “Higher-Order Functions for Parsing" ,還蠻能運作。程式放在 https://github.com/YauHsien/ParsecJ  。

寫 Java parser combinators 的技巧,用到 Generics 。用 Generics 描述 parser 的函數類型,原則是: Java class 的 type variables 對應到 parser 的輸入型態,而 Java methods 的傳回值型態,則對應到 parser 的輸出型態。另外, Java 的 parser 輸入值,都要使用 .clone() ,才可以從同一則輸入 parse 出許多種結果。

廣告

About 黃耀賢 (Yau-Hsien Huang)

熱愛 Erlang ,並且有相關工作經驗。喜歡程式語言。喜歡邏輯。目前用 Python 工作。
本篇發表於 Programming。將永久鏈結加入書籤。