1
想象我在GHCI加載一個文件(未模塊)這樣GHCI加載文件,並重新定義其功能之一在repl
:l file.hs
和該文件內有兩個功能f
和g
,並且f
有一些錯誤(例如,錯誤的結果)並且g
調用f
。
如何在GHCi REPL中重新定義f
的正確版本,並使g
可以調用新版本,而無需更改或重新加載文件?
感謝
想象我在GHCI加載一個文件(未模塊)這樣GHCI加載文件,並重新定義其功能之一在repl
:l file.hs
和該文件內有兩個功能f
和g
,並且f
有一些錯誤(例如,錯誤的結果)並且g
調用f
。
如何在GHCi REPL中重新定義f
的正確版本,並使g
可以調用新版本,而無需更改或重新加載文件?
感謝
你不能。
當加載在它彷彿定義是在一個單獨的模塊和REPL文件從而g
不會找你定義在repl時,即使從你的角度你定義點隱藏原始f
功能f
。
Haskell使用詞彙範圍,而你有什麼建議是動態作用域功能。見lexical scoping vs dynamic scoping。 修改repl以使用詞法範圍編譯來編譯代碼,然後允許人們使用動態範圍來修改它是完全不切實際的。因此它沒有完成,你所問的是不可能的。
是不是有一些不起眼的GHC API來做到這一點? – mljrg
在這種情況下,GHC可以用新版本替換'f',如果它具有相同的類型簽名。我真的不明白爲什麼這是如此困難...... – mljrg
它應該,我認爲,有可能通過實際上缺少綁定來做到這一點,只要模塊被解釋並且不被編譯。這是一個巨大的挑戰:任何時候完成這項工作,都需要運行類型檢查程序以確保一切正常。也就是說,實際的答案是在像emacs這樣的環境中運行'stack ghci'或'cabal repl',這使得快速開發更爲方便。 – dfeuer