Я читаю главу Монад в Реальном мире 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
Таким образом, мой вопрос: Какова цель, получают и помещают в целом?
Это небольшое совпадение, что random
имеет точно такую же сигнатуру / шаблон использования типа, что и внутренняя функция Монада состояния
(и действительно, в этом случае вы могли бы быть еще более кратким, если возможно, более запутанным, с getRandom2 = State random
).
Однако в более общем плане это неприменимо, а затем get
и put
- удобные элементы, смысл которых, возможно, более ясен, чем непосредственное написание внутренней функции. Они также помогают абстрагироваться от точного представления, используемого State
- на самом деле они являются членами класса более общего класса MonadState
, поэтому вы можете писать более полиморфный код, используя их.