我有一個幾乎純粹的數學計算程序。問題是這些計算中的一部分是在蒙特卡羅生成的值上運行的。如何在隨機值計算的哈斯克爾程序中構造monads?
好像我有兩個設計方案:
要麼我所有的計算功能,採取包含預先生成的蒙特卡洛鏈附加參數。這讓我可以在任何地方保持純粹的功能,但是由於存在調用其他函數的函數,因此會在代碼庫中添加很多線路噪聲。
另一種選擇是使所有的計算功能單點。這似乎是不幸的,因爲一些函數甚至沒有使用那些隨機值,他們只是調用一個函數來調用一個需要隨機值的函數。
這裏有關於首選設計的指導嗎?具體而言,蒙特卡洛值所關心的代碼中的monadic/non-monadic函數的分離?
您是否在每一步需要轉發到下一個函數時創建新的值,還是隻使用多個函數中的單個值?如果前者那麼國家monad會是一個不錯的選擇,如果後者那麼讀者monad可能是你最好的選擇。實際上你可以使用'MonadReader'編寫你的函數,然後如果你願意的話可以在以後用它們作爲純函數。 – bheklilr
這是否類似於傳遞預計算上下文,除非天真地傳遞一個列表,列表將被讀者或狀態取代? – daj
爲所有函數添加一個參數,或者將它們全部轉換爲一元操作,並不是唯一的選擇,因爲某些函數甚至不使用隨機值。不要改變那些不需要隨機性/非確定性的fns - 讓它們保持純淨。你總是可以通過你的單子/函數對它們進行「fmap」,或者在monad中的let表達式中使用它們。對於需要隨機性的動作,你可以讓他們生活在一個有MonadReader StdGen m'約束的monad中,或者讓這些fns保持純淨,但給他們一個'StdGen'參數,'拆分舊的生成器以獲得新的生成器。 。 – liminalisht