gpt4 book ai didi

haskell - 在 Haskell 中生成带有条件的随机整数列表

转载 作者:行者123 更新时间:2023-12-02 12:44:29 25 4
gpt4 key购买 nike

这里我试图生成一个整数列表,我想在其中添加随机数到列表中,而条件是 md<=1不满意。我尝试了几次,但没有成功。

fx :: Int -> Int -> IO [Int]
fx md s = do
x <- randomRIO (1,min md s)
if md<=1
then return [md]
else return md:(fx (md-x) s)

最佳答案

错误在最后一行:

else return md:(fx (md-x) s)

fx的结果位于 IO monad,并且根据该结果,您想要执行前置 md 的纯操作到它。这正是 liftM 是的,你的最后一行应该是

else liftM (md :) (fx (md-x) s)
<小时/>

其他小改进:

  • 你并不真的需要IO ,您只需要在函数内生成随机数。为此,您可以使用 MonadRandom 类型类(驻留在同名包中)。这将使函数更加具体、类型安全和灵活。
  • 生成随机数然后再检查是否需要它是多余的 - 比较 md <= 1不需要x完全没有。

因此改进版本可能如下所示:

import Control.Monad
import Control.Monad.Random

fx :: (MonadRandom m) => Int -> Int -> m [Int]
fx md s | md <= 1 = return [md]
| otherwise = do
x <- getRandomR (1, min md s)
liftM (md :) (fx (md-x) s)
<小时/>

没有 liftM 的替代方案

也许这样更容易理解:

fx :: (MonadRandom m) => Int -> Int -> m [Int]
fx md s | md <= 1 = return [md]
| otherwise = do
x <- getRandomR (1, min md s)
xs <- fx (md-x) s
return (md : xs)

关于haskell - 在 Haskell 中生成带有条件的随机整数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296031/

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