我刚从真实世界的haskell中输入了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添加实例时遇到了一些麻烦。谁能告诉我这是怎么做到的?
感谢。
答案 0 :(得分:3)
为了明确, jberryman 以及对问题的评论意味着:某种类型RandomState (a, a)
是函数,而不是值。要对其执行任何操作,您需要以初始状态运行它。
我猜你想要这样的东西:
> fmap (runState getTwoRandoms) getStdGen
((809219598,1361755735),767966517 1872071452)
这基本上是RWH正在进行的runTwoRandoms
功能。
答案 1 :(得分:2)
由于RandomState
是State
的同义词,并且没有为show
定义State
的实例,因此您将无法展示它。< / p>
您也无法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等等。