2012-06-08 2 views
2

У меня есть функция 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 монады.

Каков наилучший способ для этого?

+8

[Сформулируйте свой вопрос как тип.] (Http://www.haskell.org/hoogle/?q=Monad+m+%3D%3E+Int+-%3E+m+a+-%3E+m+% 5Ba% 5D) –

+0

'начальное состояние >> = playGame >> = playGame' не является типичным. Я могу догадаться, что вы имеете в виду, но я также могу дать лучшие и более уверенные ответы, если мне не нужно гадать :) –

+0

Его не очень хорошо напечатано, потому что я все еще пытаюсь проделать свой путь через то, что должно быть. Я просматриваю все примеры трансформаторов, которые я могу найти, но Haskell - это, безусловно, самый строго математический язык, на котором я когда-либо работал, и обертывание вокруг некоторых примеров трудно. – Ralph

ответ

8

Я думаю, что вы ищете replicateM. Это повторяет указанное действие определенное количество раз, возвращая результат в виде списка. Итак, replicateM n playGame соответствует игре n раз и получить список результатов назад.

+0

Что делать, если мне нужен только последний результат? Есть ли сокращение для этого? Помимо 'fmap last'. – ron

+0

@ron: Я не могу придумать какую-либо встроенную функцию, чтобы сделать это, но писать ее нужно легко. –

Смежные вопросы