gpt4 book ai didi

haskell - 结合 RandT 和 MaybeT

转载 作者:行者123 更新时间:2023-12-04 21:40:44 26 4
gpt4 key购买 nike

我有一个使用 Control.Monad.Random 的简单函数来创建一个可以对随机数进行采样的函数。

import Control.Monad.Random       
import Data.Random

unif_bound :: (RandomGen g, Monad m) => Double -> Double -> RandT g m Double
unif_bound lb ub = getRandomR (lb,ub)

而且,我运行它以在 GHCI 中生成随机数:
  > gen <- newStdGen
> runRandT (unif_bound 1.0 3.0) gen
(1.7569726469904563,1700403094 44073136)
> runRandT (unif_bound 3.0, 1.0) gen
(1.7569726469904563,1700403094 44073136)

但是,我想修改此代码以检查 lb < ub ,并将其包装在 MaybeT 中。这个想法是采样 lb > ub 应该返回 Nothing 。我意识到这就是 monad 转换器的用武之地,但我以前从未使用过,也不知道从哪里开始。

作为引用, RandT 定义为
-- | A monad transformer which adds a random number generator to an
-- existing monad.
newtype RandT g m a = RandT (StateT g m a)
deriving (Functor, Monad, MonadTrans, MonadIO, MonadFix, MonadReader r, MonadWriter w)

谢谢!

最佳答案

您可以对函数的类型进行相当多的概括:

unif_bound :: (Random a, Ord a, MonadRandom m) => a -> a -> MaybeT m a
unif_bound lb ub | lb > ub = MaybeT (return Nothing)
| otherwise = getRandomR (lb,ub)

请注意,您可以替换 MaybeT (return Nothing)fail ""因为这就是在 MaybeT m 的 monad 实例中定义失败的方式,但这不是很好。用法:
>runMaybeT $ unif_bound 1 10
Just 2
>runMaybeT $ unif_bound 400 1
Nothing
IOMonadRandom 的一个实例,所以你不需要摆弄 RandT如果您只是在解释器中进行测试。

关于haskell - 结合 RandT 和 MaybeT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27009719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com