>>732 |無理しているので、return a >>= k = k a が成り立たなくなってたりしているので注意。 モナドの法則を満たさなくてモナドといえるの?
735 名前:デフォルトの名無しさん mailto:sage [03/07/21 02:33]
module RandomProgression where import Random data RandomProgression r a = RP (r -> (a, r)) nextRandom :: (RandomGen r, Random a) => RandomProgression r a nextRandom = RP (\r -> random r) instance Monad RandomProgression r a where --(>>=) :: RandomProgression r a -> (a -> RandomProgression r b) -> RandomProgression r b RP x >>= f = RP (\r -> let (a, r') = x r in let RP b = f a in b r') --return :: a -> RandomProgression r a return value = RP (\r -> (value, r))
書いてみました…instanceでエラーが出ます…わかりません…
↓こんな風に使えたらいいなと思ってる let (answer, g) = (do a <- nextRandom; return (a `mod` 10)) (mkStdGen 100)
736 名前:デフォルトの名無しさん mailto:sage [03/07/21 02:45]
括弧が要るんですね… instance Monad (RandomProgression r) where 実行用に eval :: (RandomGen r) => RandomProgression r a -> r -> (a, r) eval (RP e) r = e r 書き足して RandomProgression> eval((do x <- nextRandom; return (x `mod` 10)) :: RandomProgression StdGen Int) (mkStdGen 10) (7,432453652 1655838864) 動いたー!