Причина для MonadState получает и поместила?

Я читаю главу Монад в Реальном мире Haskell (глава 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

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

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

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

12
задан Josh Lee 4 April 2010 в 15:22
поделиться

1 ответ

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

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

12
ответ дан 2 December 2019 в 21:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: