- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用给定的均值和标准差对正态分布进行采样。我知道如何在 Data.Random.Rvar 或 Data.Random.MonadRandom 等各种上下文中做到这一点。
但是,我的函数的上下文是 Control.Monad.MonadRandom,我想保持这种状态,因为我的整个项目都使用 Control.Monad.MonadRandom。
有什么办法可以做到这一点,你能帮我做到这一点吗?
下面是代码的样子。 Pattern 只是 Data.Vector Double 的别名,Weights 是 Data.Vector (Data.Vector Double)(即矩阵)的别名
train :: MonadRandom m => [Pattern] -> Int -> m Weights
train pats nr_hidden = do
ws_start <- ws_start''
foldM updateWS ws_start pats
where ws_start' = take p (repeat $ take nr_hidden $ repeat $ (normal 0.0 0.01))
ws_start'' = vector2D <$> (sequence $ map sequence ws_start')
p = length pats
最佳答案
快速回答
如何在 Data.Random.RVar
中使用 Control.Monad.MonadRandom
?
{-# LANGUAGE ScopedTypeVariables #-}
import Control.Monad.Random as CMR
import Data.Random as DR
import Data.Word (Word32)
gimmeRandom :: forall m . CMR.MonadRandom m => m Int
gimmeRandom = do
r <- runRVar (uniform 0 100) (getRandom :: m Word32)
return r
Data.Random.MonadRandom
和 Control.Monad.Random
在形式上是不同的,因为它们是在不同的地方独立定义的,并且没有一个是另一个的实例(没有 instance DR.MonadRandom m => CMR.MonadRandom m
或其他方式)。 Control.Monad.Random
接口(interface)中有一些代码:
import Control.Monad.Random as CMR
gimmeRandom :: CMR.MonadRandom m => m Int
gimmeRandom = do
r <- getRandomR (0, 100)
return r
evalRand gimmeRandom StdGen
一样运行它,它会给我们一个
Int
。
getRandomR
提供的众多可用发行版之一,而不是
Data.Random
。
getRandomR (0, 100)
替换
uniform 0 100 :: RVar Int
。我们如何从
Int
环境中的
RVar Int
中获取
CMR.MonadRandom
?
RVar
monad,我们可能必须提供一个随机数源,正如语义所暗示的那样。我们正在为 CMR 寻找一个像
evalRand 这样的 monad 转义函数。这些转义函数的类型为
m a -> someStuffNeededToRunTheMonad -> a
。
-- In a monad, using a RandomSource:
runRVar (uniform 1 100) DevRandom :: IO Int
runRVar
:
runRVar :: RandomSource m s => RVar a -> s -> m a
RVar
和一个随机数的来源,它返回我们自己的 monad
RVar
中的
m
的随机结果。然而,这需要有一个
instance RandomSource m s
表示
s
是我们 monad
m
的随机源。让我们寻找那个实例。
m
是什么?我们想在
RVar
中运行
gimmeRandom
,所以 monad 是
CMR.MonadRandom m => m
(所有实现
CMR.MonadRandom
的 monad )。什么是随机源
s
?还没有头绪。
Let us look in the docs 其中存在
RandomSource
个实例:
RandomSource IO DevRandom
...
Monad m0 => RandomSource m0 (m0 Word32)
Monad m0 => RandomSource m0 (m0 Word64)
...
m0
都是
RandomSource
的实例以及来自该 monad 的值(例如
m0 Word32
)。这当然也适用于我们的 monad
CMR.MonadRandom
。我们还可以看到
s
、
m0 Word32
一定是随机源生成的随机值。
s
中的
runRVar (uniform 0 100) s
传入?在我们的 monad 中生成随机数的东西,类型为
CMR.MonadRandom m => m Word32
的东西。什么是
CMR
函数来生成任意事物,例如一些
Word32
?
getRandom。所以基本上我们想写:
gimmeRandom :: CMR.MonadRandom m => m Int
gimmeRandom = do
r <- runRVar (uniform 0 100) getRandom
return r
Could not deduce (RandomSource m (m0 a0))
arising from a use of `runRVar'
from the context (CMR.MonadRandom m)
bound by the type signature for
gimmeRandom :: CMR.MonadRandom m => m Int
RandomSource m (m0 a0)
?这很奇怪,
m
和
m0
似乎被编译器识别为不同的 monad;我们希望它们与
RandomSource m0 (m0 Word64)
中的相同。
r <- runRVar (uniform 0 100) (getRandom :: CMR.MonadRandom m => m Word32)
m
实际上是任何实现
CMR.MonadRandom
的 monad,不一定是我们
MonadRandom
类型签名中的
gimmeRandom
。
(\x -> (\x -> f x))
中的阴影概念相同,其中内部
\x
是
f x
中使用的那个;或者在像
∀x . F(x) → ∀x . G(x)
之类的一阶逻辑中,其中
x
5 和
G(x)
5 中最需要的定义是
∀x
6甚至不是与外部
getRandom
中的类型相同的类型;或者实际上在任何其他具有内部作用域变量隐藏/阴影的编程语言中 - 只是这里是类型变量阴影)。
MonadRandom
调用中,我们不希望它是针对任何
MonadRandom m
的,而是针对我们在
gimmeRandom
类型签名中拥有的
ScopedTypeVariables
。
m
扩展名来做到这一点:
{-# LANGUAGE ScopedTypeVariables #-}
[...]
gimmeRandom :: forall m . CMR.MonadRandom m => m Int
gimmeRandom = do
r <- runRVar (uniform 0 100) (getRandom :: m Word32)
return r
getRandom :: m ...
中的
CMR.MonadRandom m
恰好是从顶级类型签名中选择的
Data.Random
。
MonadRandom
接口(interface)在代码中使用来自
uniform
的分布。我们可以很容易地用另一个发行版替换
runRVar
。
runRVar (uniform 0 100) getRandom
) getRandom
) Word32
,我们只需要以某种形式给出随机源,而 Word32 是
Data.Random
作为生成其他随机内容的输入之一。
关于haskell - 使用 Control.Monad.MonadRandom 对正态分布进行采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13936502/
有人可以提供如何使用“MonadRandom”的“傻瓜”示例吗? 目前我有一些代码可以做一些事情,比如传递生成器变量,从主函数一直到: main = do g <- getStdGen
似乎来自 random-fu 包的 MonadRandom 不是 Functor,因为我收到如下错误: Could not deduce (Functor m) arising from a use
现在我正在使用 MonadRandom 库。我有一个计算: metroChain :: (RandomGen g) => Rand g Double 我想执行多次,然后依次打印出结果。或者更确切地说,
我正在编写一些使用 State 的代码(围绕纸牌策略)和递归在一起。也许这部分实际上并不需要(即使作为一个相对的初学者,它对我来说已经感觉很笨拙),但是还有其他部分可能会这样做,所以我的一般问题是..
我想用给定的均值和标准差对正态分布进行采样。我知道如何在 Data.Random.Rvar 或 Data.Random.MonadRandom 等各种上下文中做到这一点。 但是,我的函数的上下文是 C
下面的简单代码 import Control.Monad import Control.Monad.Random psum :: (MonadRandom r) => Int -> r Double
我希望能够使用 MWC random number generator与 random-fu,因此需要实现 MonadRandom 的实例。我的尝试是将 Reader (Gen (PrimState
我正在尝试使用 https://hackage.haskell.org/package/random-fu-0.2.6.0/docs/Data-Random.html#g:6 中的 MonadRand
class (Eq e, GenExpr e, MonadRandom m) => GenProg m e | e -> m where 确切地说,我无法理解这个GenProg m e | e ->
我是一名优秀的程序员,十分优秀!