У меня есть функция Haskell, которая возвращает монаду, объявленный следующим образом:Многократное вызов монады Haskell
data Options = Options {
optGames :: Int,
optSuits :: Int,
optVerbose :: Bool
} deriving Show
playGame :: Options -> StateT StdGen (WriterT [String] IO)) Bool
Эта функция играет одну игру пасьянса, а затем возвращает логическое значение, указывающее на выигрыш или потери, наряду с log в монаде WriterT
.
Я бы назвал эту функцию заданным числом раз, каждый раз используя «следующее» значение случайного генератора (StdGen
) и объединяя возвращаемые значения Bool
в списке.
Я попытался создать рекурсивную функцию для выполнения вызовов, но не могу понять, как передать монаду в каждую следующую итерацию.
Я хотел бы подражать
initial state >>= playGame >>= playGame ... -- repeat N times
и собрать все в результате Bool
значений, а также записи журнала из WriterT
монады.
Каков наилучший способ для этого?
[Сформулируйте свой вопрос как тип.] (Http://www.haskell.org/hoogle/?q=Monad+m+%3D%3E+Int+-%3E+m+a+-%3E+m+% 5Ba% 5D) –
'начальное состояние >> = playGame >> = playGame' не является типичным. Я могу догадаться, что вы имеете в виду, но я также могу дать лучшие и более уверенные ответы, если мне не нужно гадать :) –
Его не очень хорошо напечатано, потому что я все еще пытаюсь проделать свой путь через то, что должно быть. Я просматриваю все примеры трансформаторов, которые я могу найти, но Haskell - это, безусловно, самый строго математический язык, на котором я когда-либо работал, и обертывание вокруг некоторых примеров трудно. – Ralph