2010-06-22 73 views
2

我剛剛從真實世界的haskell中輸入了RandomState示例。它看起來像這樣:將一個Show實例添加到RWH的RandomState示例中

import System.Random 
import Control.Monad.State 

type RandomState a = State StdGen a 

getRandom :: Random a => RandomState a 
getRandom = 
    get >>= \gen -> 
    let (val, gen') = random gen in 
    put gen' >> 
    return val 

getTwoRandoms :: Random a => RandomState (a, a) 
getTwoRandoms = liftM2 (,) getRandom getRandom 

它的工作,但結果不顯示。我收到錯誤信息:

No instance for (Show (RandomState (Int, Int))) 
    arising from a use of `print' at <interactive>:1:0-38 
Possible fix: 
    add an instance declaration for (Show (RandomState (Int, Int))) 
In a stmt of a 'do' expression: print it 

我在爲Show RandomState添加實例時遇到了一些麻煩。任何人都可以告訴我這是怎麼完成的?

謝謝。

+1

要診斷這一點,我們需要您用來嘗試打印的代碼。我猜你忘了runState? – 2010-06-22 06:18:00

+0

我沒有寫任何額外的代碼打印,我只是跑了:getTwoRandoms ::(RandomState(Int,Int)) 但是RandomState不知道如何顯示它自己。聽起來像我沒有忘記runState。 – Kurt 2010-06-22 08:02:36

+0

也許你想要'runTwoRandoms'代替下面的一個部分? – kennytm 2010-06-22 11:47:29

回答

3

對於被明確起見,作爲jberryman關於這個問題的評論暗示:東西RandomState (a, a)型的是一個函數,而不是一個值。要做任何事情,你想運行它與初始狀態

我猜你想是這樣的:

> fmap (runState getTwoRandoms) getStdGen 
((809219598,1361755735),767966517 1872071452) 

這基本上是什麼runTwoRandoms功能位進一步RWH在做什麼。

+0

我將不得不再次閱讀那一章。我真的認爲我已經開始明白了。 – Kurt 2010-06-22 14:54:29

+1

@Kurt:它是否讓你絆倒了「隱藏」功能?有點令人困惑的是,儘管它實際上是's - >(a,s)'類型的函數,你可以在'do'塊中處理'State s a'類型的類型'a'的值。通過「State」的重新實現似乎可以幫助一些人更好地感受它的工作方式和原因 - 我在[我以前的答案之一]中做到了這一點(http://stackoverflow.com/questions/1956518/1957379 #1957379),我也看過一篇博文或兩篇文章。 – 2010-06-22 15:05:58

+0

@Kurt:國家monad很奇怪。以這種方式考慮一下:所有的monadic機器('>> =','return'等)都是在'State'包裝器中組成一個大功能的。然後,通過應用'runState'來處理那些monad /函數的東西,runState只是將這個函數從'State'包裝中取出(就像'fst'拉取一個元組的第一個元素,他們只給'runState'一個聰明的名字混淆你) – jberryman 2010-06-22 17:01:30

2

由於RandomStateState的同義詞,並且沒有爲State定義的show的實例,因此您將無法顯示它。

你也不能derive show因爲State僅僅是一個函數的包裝和Haskell有沒有辦法定義show的功能,將是有益的:

Prelude> show (+) 

<interactive>:1:0: 
    No instance for (Show (a -> a -> a)) 
     arising from a use of `show' at <interactive>:1:0-7 
    Possible fix: add an instance declaration for (Show (a -> a -> a)) 
    In the expression: show (+) 
    In the definition of `it': it = show (+) 

編輯:忘了添加其他部分:GHCi給你的錯誤,因爲它在幕後使用show你輸入的表達式...... REPL和所有這些。

相關問題