Добавление экземпляра Show в пример RWH RandomState - PullRequest
2 голосов
/ 22 июня 2010

Я только что набрал в примере RandomState из реального мира haskell. Это выглядит так:

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 ]

3 голосов
/ 22 июня 2010

Ради ясности, например, jberryman и комментарии к вопросу подразумевают: Что-то типа RandomState (a, a) является функцией, а не значением. Чтобы что-то сделать сэто, вы хотите запустить его с начальным состоянием .

Я предполагаю, что вы хотите что-то вроде этого:

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

Это, по сути, runTwoRandoms Функция немного дальше в RWH делает.

2 голосов
/ 22 июня 2010

Поскольку RandomState является синонимом для State, и для 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 и все такое.

...