将Show实例添加到RWH的RandomState示例中

时间:2010-06-22 05:43:36

标签: monads haskell

我刚从真实世界的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添加实例时遇到了一些麻烦。谁能告诉我这是怎么做到的?

感谢。

2 个答案:

答案 0 :(得分:3)

为了明确, jberryman 以及对问题的评论意味着:某种类型RandomState (a, a)是函数,而不是值。要对其执行任何操作,您需要以初始状态运行它。

我猜你想要这样的东西:

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

这基本上是RWH正在进行的runTwoRandoms功能。

答案 1 :(得分:2)

由于RandomStateState的同义词,并且没有为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等等。