2015-10-31 54 views
1

想象我在GHCI加載一個文件(未模塊)這樣GHCI加載文件,並重新定義其功能之一在repl

:l file.hs 

和該文件內有兩個功能fg,並且f有一些錯誤(例如,錯誤的結果)並且g調用f

如何在GHCi REPL中重新定義f的正確版本,並使g可以調用新版本,而無需更改或重新加載文件?

感謝

回答

2

你不能

當加載在它彷彿定義是在一個單獨的模塊和REPL文件從而g不會找你定義在repl時,即使從你的角度你定義點隱藏原始f功能f


Haskell使用詞彙範圍,而你有什麼建議是動態作用域功能。見lexical scoping vs dynamic scoping。 修改repl以使用詞法範圍編譯來編譯代碼,然後允許人們使用動態範圍來修改它是完全不切實際的。因此它沒有完成,你所問的是不可能的。

+0

是不是有一些不起眼的GHC API來做到這一點? – mljrg

+0

在這種情況下,GHC可以用新版本替換'f',如果它具有相同的類型簽名。我真的不明白爲什麼這是如此困難...... – mljrg

+0

它應該,我認爲,有可能通過實際上缺少綁定來做到這一點,只要模塊被解釋並且不被編譯。這是一個巨大的挑戰:任何時候完成這項工作,都需要運行類型檢查程序以確保一切正常。也就是說,實際的答案是在像emacs這樣的環境中運行'stack ghci'或'cabal repl',這使得快速開發更爲方便。 – dfeuer