我有一個在父函數中實例化的結構,我想通過調用該父函數的函數來修改該實例化的數據。這裏是一個人爲的例子:完成這項任務有哪些選擇?
import Data.List
data MyLists = MyLists {
myInts :: [Int],
myBools :: [Bool]
} deriving (Show)
addIntToList :: Int -> MyLists -> MyLists
addIntToList x main_lists =
main_lists { myInts = Data.List.insert x my_ints }
-- might make a call to another child function that modifies main_list here, and so on (i.e., this is the vertical problem I see with this structuring)
where
my_ints = myInts main_lists
main :: IO()
main = do
let my_main_lists = MyLists [1,2,3] [False, True, False]
let my_new_main_lists = addIntToList 4 my_main_lists
print my_new_main_lists
let my_new_new_main_lists = addBoolToList True my_new_main_lists
print my_new_new_main_lists
-- and so on (this is the lateral problem I see with this code structuring)
有什麼選擇的方式來構建這個代碼或者完成與此類似的任務?有更簡潔的方法嗎?
我應該補充說,一旦你對子函數做了一個長的函數調用,這會變得特別臭(即代碼異味);他們最終都需要返回一個新的MyLists
或只是返回main_list
而不做任何事情。那和父母可能還必須處理MyList
和另一個返回值(例如,-> (Bool, MyList)
)。所以,你可以想象一個函數的樹結構調用都需要一個MyList參數和返回值;這似乎並不理想。
下面是我談論的這種事情的更具體的例子。瀏覽代碼https://github.com/mokehehe/monao(哈斯克爾超級馬里奧克隆)。你會看到state.monad從不使用,並且有上層結構必須在整個代碼中流動(例如,Main.hs中的GameGame)。
你期望輸出什麼?有int列表進行排序? – epsilonhalbe
輸出與預期的一樣('MyLists {myInts = [1,2,3,4],myBools = [False,True,False]}')。我正在尋找更好的方式來構建這些代碼。 – joshj
在'addBoolToList True my_main_lists'中,不應該是'my_new_main_lists'? –