2012-02-06 28 views
3

由於Haskell的數據是不可變的,你怎麼會在全球存儲可以被任何函數修改列表嗎?您muiltithread,並將其存放在一個循環?或寫列表保存到文件? 我需要記錄用戶點擊的按鈕數量。哈斯克爾不可改變的數據

+8

那麼,從廣義上講,你不會。如果你想 - 特別是作爲初學者 - 這可能意味着你正在嘗試在Haskell中編寫其他語言。 – 2012-02-06 02:11:35

回答

12

一般來說,你不會,因爲,如你所說,Haskell的數據(主要是)不變。

如果你要開始一個列表,並通過了一大堆的更新功能運行它,你必須每個函數把列表作爲參數,並返回更新後的列表作爲結果。然後你有一些協調功能(可能main,如果這是你的程序正在做的),將每個更新的輸出提供給下一個更新程序。

它可以使用的東西,像State monad與隱性狀態更新程序,或者使用在IO單子的單子ST或IORefs STRefs與實際上可以就地更新的東西隱性狀態更新進行編程。但Haskell程序員通常不希望他們的大部分程序在這樣的monad中隱含全局訪問可寫值。

2

你會使用狀態單子(或IO單子,將ST單子,或別的類似)。或者,您可以將它作爲參數傳遞給每個函數,並從每個函數返回新值(這是各種單元爲您所做的)。

有沒有辦法讓全局可變狀態,而不使每一個需要國家利用單子功能。這是Haskell設計者的一個有意選擇 - 每一個非一元函數都需要透明地透明(這意味着該函數對於給定的一組輸入總是返回相同的值),並且如果存在可變狀態一個非單調函數,它可能會返回可變狀態並違反參照透明度。

從技術上講,一元函數也引用透明 - 即使是模擬的副作用,採取並返回一個額外的世界參數(這是隱藏的單子的部分)做到這一點的人。

+0

不*相當*正確,但接近(沒有隱藏的世界參數,你不能使用任意Monad作爲可變狀態等)。 – ivanm 2012-02-06 02:17:41