此代码泄漏或不依赖于我如何编译相同的RWS实现:
import Control.Monad (replicateM_)
import qualified Control.Monad.RWS.CPS as RWS
import Data.Monoid (Sum (..))
-- import qualified RWS
{-# ann module "HLint: ignore Use camelCase" #-}
count_a_lot :: Int -> RWS.RWS () (Sum Int) () ()
count_a_lot = flip replicateM_ count
count :: RWS.RWS () (Sum Int) () ()
count = RWS.tell . Sum $ 1
main :: IO ()
main = print . snd $ RWS.evalRWS (count_a_lot 10000000) () ()
Run Code Online (Sandbox Code Playgroud)
我尝试了两种使用CWS版本的RWS的方法:
import qualified Control.Monad.RWS.CPS as RWS
使用writer-cps-transformers
nixpkgs中的软件包。import …
当使用random-fu 0.3.0.0时,我对探索random
.
检查:t
我得到
ghci> :t Data.Random.sample
Data.Random.sample
:: (Data.Random.Distribution d t, Data.Random.StatefulGen g m,
Control.Monad.Reader.Class.MonadReader g m) =>
d t -> m t
Run Code Online (Sandbox Code Playgroud)
但:i
表现出不同的类型
ghci> :i Data.Random.sample
Data.Random.sample ::
(Data.Random.Sampleable d m t, Data.Random.StatefulGen g m,
Control.Monad.Reader.Class.MonadReader g m) =>
d t -> m t
-- Defined in `Data.Random.Sample'
Run Code Online (Sandbox Code Playgroud)
源代码似乎需要Sampleable
约束。有趣的是,有一条评论要求Distribution
改为。
-- |Sample a random variable using the default source of entropy for the
-- monad in which …
Run Code Online (Sandbox Code Playgroud) 我在RVarT
用随机符包裹大脑时遇到困难。就像一种心理锻炼一样,我尝试使用monad变压器Maybe x
随机生成并合并到其中Maybe (x, x)
我努力做到这一点,对我来说似乎很直观
maybeRandSome :: (MaybeT RVar) Int
maybeRandSome = lift $ return 1
maybeRandNone :: (MaybeT RVar) Int
maybeRandNone = MaybeT . return $ Nothing
maybeTwoRands :: (MaybeT RVar) (Int, Int)
maybeTwoRands =
do
x <- maybeRandSome
y <- maybeRandNone
return (x, y)
Run Code Online (Sandbox Code Playgroud)
并可以在IO中进行采样
> sample $ runMaybeT maybeTwoRands
Nothing
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚是否可以逆转:
reverseMaybeRandSome :: (RVarT Maybe) Int
reverseMaybeRandSome = lift $ Just 1
reverseMaybeRandNone :: (RVarT Maybe) Int
reverseMaybeRandNone = lift Nothing
reverseMaybeTwoRands …
Run Code Online (Sandbox Code Playgroud)