Типичный сценарий использования flatMap в State Monad? - PullRequest
0 голосов
/ 19 сентября 2019

Я прочитал определение государственной монады следующим образом, которое включает в себя определение flatMap.Дословное определение flatMap мне ясно, но каков типичный вариант его использования?

trait State[S,A]{
  def run (initial:S):(S,A)
  def flatMap[B] (f:A=>State[S,B]):State[S,B] = 
    State{ s =>
      val (s1, a) = run(s)
      f(a).run(s1)
    }
}

object State{
  def apply[S,A](f:S => (S,A)):State[S,A] =
    new State[S,A] {
        def run(initial:S): (S,A) = f(initial) 
    }
}

Ответы [ 2 ]

2 голосов
/ 19 сентября 2019

Согласно кошкам State Монада Документация

Метод flatMap в State[S, A] позволяет использовать результат одного State в последующем State

Это означает, что мы можем иметь переходы состояний, хорошо выстроенные в линию для для понимания примерно так

val createRobot: State[Seed, Robot] =
  for {
    id <- nextLong
    sentient <- nextBoolean
    isCatherine <- nextBoolean
    name = if (isCatherine) "Catherine" else "Carlos"
    isReplicant <- nextBoolean
    model = if (isReplicant) "replicant" else "borg"
  } yield Robot(id, sentient, name, model)

В общем, цель flatMapэто цепочка монадических вычислений, поэтому, какую бы монаду мы ни имели, мы можем вставить ее для понимания.

2 голосов
/ 19 сентября 2019

Эта цитата взята из вики-книг о государственной монаде в haskell.

Если вы ранее программировали на каком-либо другом языке, вы, вероятно, написали некоторые функции, которые «сохраняли состояние».Для тех, кто не знаком с этой концепцией, состояние - это одна или несколько переменных, которые необходимы для выполнения некоторых вычислений, но не входят в число аргументов соответствующей функции.В объектно-ориентированных языках, таких как C ++, широко используются переменные состояния (в форме переменных-членов внутри классов и объектов).Процедурные языки, такие как C, с другой стороны, обычно используют глобальные переменные, объявленные вне текущей области видимости, чтобы отслеживать состояние.Однако в Haskell такие методы не так просты для применения.Для этого потребуются изменяемые переменные, которые означают, что функции будут иметь скрытые зависимости, что противоречит функциональной чистоте Haskell.К счастью, часто можно отслеживать состояние в функционально чистом виде.Мы делаем это, передавая информацию о состоянии от одной функции к другой, тем самым делая явные скрытые зависимости.

В основном его целью является написание чисто функциональных программ, которые манипулируют состоянием, с помощью API, вычисляющегоследующее состояние, а не что-либо действительно мутировавшее.

Наиболее распространенные примеры монады состояния:

  1. Генерация случайных чисел .
  2. Создание игр
  3. Парсеры
  4. Структуры данных
  5. Любая программа конечного автомата.

Вы также можете проверить страницу cats для монады состояний

Примечание. Существует еще одна более сложная монада состояний, которая называется IndexedState monad,что в основном дает вам возможность изменить состояние.

...