2015-03-19 51 views
2

我學習狀態單子和維基無法理解一個例子(http://en.wikibooks.org/wiki/Haskell/Understanding_monads/StateStucked在國家單子在Haskell維基的例子

rollDie :: GeneratorState Int 
rollDie = do generator <- get 
      let (value, newGenerator) = randomR (1,6) generator 
      put newGenerator 
      return value 

put有定義

put newState = State $ \_ -> ((), newState) 

看來put只需創建一個新的State,這條線的真實用途是什麼?如果想要使用的值可能應該使用<-來提取,如果想再次使用state應該使用get。如果刪除這一行(或者我錯過了什麼?),這沒什麼區別,那麼,這一行真的意味着什麼?

+0

您可以將'State state a'視爲一個函數,因爲'state'返回一個_new_狀態和一個值。 'put'只是忽略之前的狀態,返回單位,但將給定的'newState'設置爲下一次計算的狀態。 – Zeta 2015-03-19 09:52:02

+0

@Zeta感謝您的回覆!我明白'put'的作用,但是'newGenerator'的用法是什麼?如果我刪除這一行,是否有任何改變? – hliu 2015-03-19 09:56:11

回答

7

刪除put並獲得一些隨機值。我預測你會一直得到相同的「隨機值」。這就是haskell中隨機生成器的工作原理:它(即randomR)是一個純函數 - 給定相同的生成器,它將始終返回相同的結果。您必須將新的發生器提供給下一個呼叫。這是通過put完成的。

+3

這就是一個良好的'State'實現提供'state ::(s - >(a,s)) - > State s b'的原因。然後'rollDie = state(randomR(1,6))'。 – Zeta 2015-03-19 10:23:28

+0

嗯......我終於明白了。謝謝。 – hliu 2015-03-19 12:48:14