我需要備份一些數據以便以後訪問它。在Haskell中隱藏函數參數?
在接口級別,我有兩個功能:
put
:備份數據,並返回一個backup_Id
。get
:檢索給定數據backup_Id
。
我目前的代碼要求我提供這兩個函數的備份參數。
import Data.Maybe
data Data = Data String deriving Show
type Backup = [(String,Data)]
put :: Backup -> String -> IO Backup
put boilerPlate a =
do let id = "id" ++ show(length (boilerPlate))
putStrLn $ id ++": " ++ a
return ((id,(Data a)):boilerPlate)
get :: Backup -> String -> Maybe Data
get boilerPlate id = lookup id (boilerPlate)
它工作正常。
在下面的示例中,備份了兩個值。第二個被檢索。
main :: IO()
main = do
let bp0 = []
bp1 <- put bp0 "a"
bp2 <- put bp1 "b"
let result = get bp2 "id1"
putStrLn $ "Looking for id1: " ++ show (fromJust(result))
但是我需要擺脫所有的備份參數來簡化put
和get
簽名。
我需要的東西,看起來像這樣:
main = do
put "a"
put "b"
let result = get "id1"
什麼是實現這一目標的最簡單的方法?
你可以用一個MVar來做它,儘管我不能很好地推薦這個。爲什麼不創建備份monad並在其中進行計算? –
您是否熟悉State monad/StateT monad變壓器? – ErikR
我並不熟悉單子,也不熟悉國家,也不熟悉變壓器。在爲我的問題尋找解決方案的同時,我的印象是這是一條正確的路。我試圖實現它,但沒有成功。如果有人能夠在我的代碼中「注入State Monad」,我認爲這將是我能找到的最佳教程。 –