Подтвердить что ты не робот

Причина, по которой MonadState получает и ставит?

Я читаю главу Monads в Real World 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

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

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

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

4b9b3361

Ответ 1

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

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