小编Sam*_*vas的帖子

从源编译时的空间行为与链接到包时的空间行为不同

此代码泄漏或不依赖于我如何编译相同的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-transformersnixpkgs中的软件包。
  • import …

haskell

8
推荐指数
1
解决办法
104
查看次数

`:i` 如何显示与 `:t` 不同的类型?

当使用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)

haskell ghc

6
推荐指数
1
解决办法
81
查看次数

如何在IO中采样RVarT

我在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)

random haskell monad-transformers

1
推荐指数
1
解决办法
55
查看次数

标签 统计

haskell ×3

ghc ×1

monad-transformers ×1

random ×1