我是一名高級C/C++/Java/Assembler程序員,我一直對純函數式編程範例感興趣。我會不時試着實現一些有用的東西,比如一個小工具,但是我經常會很快到達一個地步,我意識到我(和我的工具)在非純語言中會快得多。這可能是因爲我掌握了大量的命令式編程語言經驗,在我的腦海中有成千上萬的偶像,模式和典型的解決方案。如何在引入狀態時限制代碼更改?
這是其中的一種情況。我已經遇到過好幾次了,我希望你們能幫助我。
我們假設我編寫了一個工具來模擬通信網絡。一個重要的任務是生成網絡數據包。產生是相當複雜的,由數十個功能和配置參數,但最後有一個主功能,因爲我覺得它非常有用,我總是寫下簽名:
generatePackets :: Configuration -> [Packet]
然而,過了一段時間我注意到如果數據包生成在生成過程的許多子功能中的某一個內部具有某種隨機行爲,那將是非常好的。因爲我需要一個隨機數生成器(和我還需要在代碼中的其他地方),這意味着手動更改幾十個簽名來像
f :: Configuration -> RNGState [Packet]
與
type RNGState = State StdGen
我理解這背後的「數學」必要性(沒有國家)。我的問題是在更高層次上:經驗豐富的Haskell程序員如何處理這種情況?什麼樣的設計模式或工作流程可以在以後避免額外的工作?
我從來沒有與經驗豐富的Haskell程序員合作過。也許你會告訴我,你永遠不會寫簽名,因爲你必須經常改變它們,或者你給所有的函數一個狀態單元,「以防萬一」:)
我不認爲有什麼辦法可以避免這個......而且這個*很好*。將某些東西從純粹的變成不純的**是一件大事,並且讓代碼無聲地編譯這種變化意味着你幾乎完全放棄了類型安全...... – Bakuriu
如何在配置中添加隨機種子? – immibis
我想知道這個問題是否更適合程序員.stackexchange.com,因爲這是一個關於軟件開發實踐的問題。 – chepner