2014-09-13 52 views
1

我在讀「!瞭解你一個Haskell爲大善」,精緻漂亮的書,我知道如何使用函數內部遞歸處理狀態或在許多情況下,簡單摺疊可以在經驗語言代替代碼中需要的突變,這是確定純函數式編程:如何編寫代碼,其中3個功能可能會影響同一狀態

我讀過有關國家的單子,這是不錯,但我覺得這只是一個詭計。這句話描述了簡明什麼狀態單子

國家單子是真的結束了一個額外的參數周圍傳遞 狀態的功能的想法的抽象 - 它仍然 純,它只是給你很多的語法幫助

how to simulate haskell state?

現在我想在hypotetical代碼:

我有3個功能,第一一個「用戶」返回一個包含用戶名和年齡的元組(「tom」,20)。第二個也返回與公司名稱和基礎的一年的元組(「谷歌」,1998年)和第三可能是一個非贏利組織(「Mozilla的」,2003年),非常簡單。

但是什麼發生,如果我需要在每次調用?這些元組將被附加到一個列表中?

選中此反應似乎我可以(可能?)使用可變的狀態

Managing state - chapter 3 of SICP

是否有可能一個不可改變的,純淨的選擇嗎?我很確定使用功能反應式編程是可能的,但我希望知道「經典的純功能解決方案」。

+1

這我不清楚你是什麼問。如果每個函數都返回這三個值中的一個,那麼狀態是什麼? – Cirdec 2014-09-13 05:56:53

+0

不爲什麼,只返回與附加數據的新名單。 – 4lex1v 2014-09-13 06:14:01

+0

嗨Cirde,對不起,如果我的問題不明確:我需要比所有這些功能添加一個元組到同一個列表L ...國家將在單列表 – user1050817 2014-09-13 06:19:03

回答

4

假設你想這三種類型的元組的

data Item = User  String Int 
      | Company String Int 
      | NonProfit String Int 

然後加入Item s到狀態列表之間進行區分是非常簡單的:

addUser, addCompany, addNonProfit :: String -> Int -> State [Item]() 
addUser  name age  = modify (\st -> User  name age  : st) 
addCompany name founded = modify (\st -> Company name founded : st) 
addNonProfit name founded = modify (\st -> NonProfit name founded : st)