Причину для MonadState получить и поставить? - PullRequest
12 голосов
/ 04 апреля 2010

Я читаю главу "Монады" в реальном мире Хаскелла (глава 14). Функция определена следующим образом:

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

Я не совсем понимаю назначение функций get и put здесь. Я переписал функцию следующим образом, которая, кажется, делает то же самое и является более краткой:

getRandom2 :: Random a => RandomState a 
getRandom2= State $ \ s -> random s

Итак, мой вопрос: Какова цель получить и поставить вообще?

1 Ответ

12 голосов
/ 04 апреля 2010

Это немного совпадение, что random имеет точно такой же тип сигнатуры / шаблона использования, что и внутренняя функция монады State (и действительно, в этом случае вы можете быть еще более краткими, если, возможно, более путать, с getRandom2 = State random).

Тем не менее, в более общем смысле это не будет применяться, и тогда get и put - это удобные сантехнические элементы, значение которых, возможно, яснее, чем непосредственное написание внутренней функции. Они также помогают абстрагироваться от точного представления, используемого State - они на самом деле являются членами класса более общего класса MonadState, поэтому вы можете написать более полиморфный код, используя их.

...