2011-10-12 38 views
1

我想使用一組函數名作爲Data.Map鍵,並且在該函數中自動提供每個函數的鍵。如果有必要,我願意考慮「不安全」的行動。函數「我是誰」可以從函數訪問並可用作關鍵字?

我的具體規劃問題是這樣的:我已經開發的文本轉換,這是我特別使用預處理和修飾我的所有的Haskell代碼的簡單解析庫。它具有足夠小的優點以便輕易入侵,大多數構造不需要明確的一元符號。相反,語法與他們的正式描述幾乎完全一樣。

特別是,我已經進入了Haskell2010的詞彙結構一旦,想法以不同的應用程序以各種方式修改這個語法。我現在通過創建與每個語法結構相對應的標籤並將這些標籤傳遞給每個結構來實現這一點。我也使用這些標籤作爲Data.Map的關鍵字。這使我可以在我的語法的不同應用程序中爲各種標籤提供後處理。

我的代碼的細節並不真正的問題;我的問題的要點應該清楚,對於我在這裏描述的任何類似的應用。這裏是文法Haskell2010的(草案)片段:

program = Program § 
    many $ lexeme ∨ whitespace 

lexeme = Lexeme § 
    reservedop ∨ reservedid ∨ qvarid ∨ qconid ∨ qvarsym ∨ qconsym ∨ literal 
    ∨ special 

literal = Literal § 
    integer ∨ float ∨ hchar ∨ hstring 

special = Special § 
    oneOf "(),;[]`{}" 

whitespace = Whitespace § 
    many1 whitestuff 

whitestuff = Whitestuff § 
    whitechar ∨ comment ∨ ncomment 

whitechar = Whitechar § 
    newline ∨ vertab ∨ space ∨ tab ∨ uniWhite 

newline = Newline § 
    hreturn ◊ linefeed ∨ hreturn ∨ linefeed ∨ formfeed 

已經努力使語法簡潔,我覺得這是重複的樣板非常難看。爲什麼我不能自己使用函數名稱,並讓每個函數根據需要訪問自己的名稱? (運營商是monadic,所以有機會在幕後做我們喜歡的任何事情。)

我理解並享受解釋爲什麼在Lisp(Scheme)或任何對象中構造「X」的參數元遊戲面向對象的語言在Haskell中並不是必需的,因爲它只是做「Y」。與Haskell相比,Lisp既不那麼自律,看起來也更加靈活。 Lisp讓我想起動畫誕生之初的早期「墨硯」漫畫,手中的一隻手可以從屏幕後面出來,根據需要重繪一些東西以彎曲規則。

從替代的觀點(這就像我會盡量避免一切宗教)這是一個相當常規使用「自我」的一種面向對象的點。然而,我不想在這裏創建一個完整的面向對象的框架,我只是想直接訪問符號表(或等價物,無論是否完成工作),因爲這些其他語言提供了一種方式或另一個。

所以我很尷尬,我不能在這裏玩這個薈萃遊戲。在我看來,Haskell整潔而且有嚴格的紀律,封鎖了對符號表和運行時環境的訪問,讓我可以打高爾夫球這個代碼,擺脫這種難以置信的樣板。或不?我在這裏問。

+2

我不知道我明白你在說什麼?你可以寫兩行:1。我有.... 2.我想.... – Ingo

+0

1.我有一個解析器,在我的編碼Haskell2010的詞法結構,從報告中服用。我想以多種方式使用這個文件,這需要修改這個冗長的描述中間的函數。我理解在其他語言中這樣做的範例,但不在Haskell中。 – Syzygies

+0

2.我希望能夠爲Data.Map使用函數(Show,Eq,Ord,Bounded,Enum)。我希望每個功能都能夠自動找出相應的鍵,而無需我的明確幫助。換句話說,我更願意在面向對象的語言中使用一小部分「自我」功能。 – Syzygies

回答

4

我認爲你不能在符合標準的Haskell中做到這一點,因爲它破壞了引用透明性,但是使用名爲Template Haskell的GHC擴展名可以完成。模板Haskell允許您在編譯時運行自定義代碼以生成樣板代碼或執行更有趣的事情(您可能想要轉換現有代碼以實現您的目標)。

+0

請看http://www.haskell.org/ ghc/docs/latest/html/libraries/base/System-Mem-StableName.html考慮你的答案,我可以利用參考透明牆上的單個裂縫創建具有我需要的自我感的對象的機制和其他人可能需要)。我打算使用外部函數接口,但「穩定名稱」看起來像他們已經完成了這一點。 – Syzygies

+0

你必須小心'StableName's。引用文檔,「如果兩個穩定的名稱不相同,那麼它們命名的對象可能仍然是相等的」。 – Rotsor

相關問題