Haskell 如何将随机数附加到列表中
我编写了一个函数来生成随机数:Haskell 如何将随机数附加到列表中,haskell,Haskell,我编写了一个函数来生成随机数: drawFloat :: Float -> Float -> IO Float drawFloat x y = getStdRandom (randomR (x,y)) 现在我有一个列表[1,2,3] 如何将随机数附加到此列表中 我尝试了[1,2,3]++(drawFloat 2 10)它不起作用 错误消息: Couldn't match expected type ‘[a]’ with actual type ‘IO a0’ Rel
drawFloat :: Float -> Float -> IO Float
drawFloat x y = getStdRandom (randomR (x,y))
现在我有一个列表[1,2,3]
如何将随机数附加到此列表中
我尝试了[1,2,3]++(drawFloat 2 10)
它不起作用
错误消息:
Couldn't match expected type ‘[a]’ with actual type ‘IO a0’
Relevant bindings include it :: [a] (bound at <interactive>:72:1)
In the second argument of ‘(++)’, namely ‘(drawFloat 2 10)’
In the expression: [1, 2, 3] ++ (drawFloat 2 10)
无法将预期类型“[a]”与实际类型“IO a0”匹配
相关绑定包括::[a](绑定时间:72:1)
在“(++)”的第二个参数中,即“(drawFloat 2 10)”中
在表达式中:[1,2,3]++(drawFloat 2 10)
我还尝试了
[1,2,3]++[(drawFloat 2 10)]
。仍然不起作用。因此,drawFloat
的类型是Float->Float->IO Float
。我们只能附加一个[Float]
。试一试
appendRand :: [Float] -> IO [Float]
appendRand lis = (lis ++) . return <$> drawFloat 2 10
appendRand::[Float]->IO[Float]
附录lis=(lis++)。返回浮动2 10
这里我们提升函数
(list++)。return::Float->[Float]
到一个IO Float->IO[Float]
这正是我们想要的。(这里,return
操作的是[]
monad,而不是IO
)因此,drawFloat
的类型是Float->Float->IO Float
。我们只能附加一个[Float]
。试一试
appendRand :: [Float] -> IO [Float]
appendRand lis = (lis ++) . return <$> drawFloat 2 10
appendRand::[Float]->IO[Float]
附录lis=(lis++)。返回浮动2 10
这里我们提升函数
(list++)。return::Float->[Float]
到一个IO Float->IO[Float]
这正是我们想要的。(这里,return
操作的是[]
单子,而不是IO
)因为drawFloat
返回一个单子类型,所以您必须深入到同一个单子中才能附加:
import System.Random
drawFloat :: Float -> Float -> IO Float
drawFloat x y = getStdRandom (randomR (x,y))
appendRandom :: [Float] -> IO [Float]
appendRandom as = do
val <- drawFloat 2 10
return $ as ++ [val]
main = appendRandom [1, 2, 3] >>= print
导入系统。随机
drawFloat::Float->Float->IO Float
drawFloat x y=getStdRandom(randomR(x,y))
appendRandom::[Float]->IO[Float]
appendas=do
val>=打印
因为drawFloat
返回一个单子类型,所以您必须深入到同一个单子中才能附加:
import System.Random
drawFloat :: Float -> Float -> IO Float
drawFloat x y = getStdRandom (randomR (x,y))
appendRandom :: [Float] -> IO [Float]
appendRandom as = do
val <- drawFloat 2 10
return $ as ++ [val]
main = appendRandom [1, 2, 3] >>= print
导入系统。随机
drawFloat::Float->Float->IO Float
drawFloat x y=getStdRandom(randomR(x,y))
appendRandom::[Float]->IO[Float]
appendas=do
val>=打印
drawFloat 210>=\x>返回([1,2,3]+[x])
或(\x->[1,2,3]+[x])drawFloat 210
drawFloat 210>=\x>返回([1,2,3]+[x])
或(\x->[1,2,3]+[x])drawFloat 210
。如果我想在正常列表中添加一个随机数列表,该怎么办。我该怎么做?例如:一个普通的列表[]
附加一个随机列表[1,2,3]
(这些数字是由函数drawFloat生成的)?@CSnerd如果你想附加一个随机数字列表,你可以创建一个生成随机列表的函数,比如randList=mapM(const$rawFloat 2 10)[1..n]
然后再附加这个函数,比如(lis++)随机列表
@CSnerdrandGrid::Int->Float->IO[Int]
,randGrid n p=(mapM.mapM)(const$singleRandP)$(replicate n.replicate n)1
,其中singleRandP::Float->IO Int
生成具有概率p
的1
。另外,请停止更新同一个问题,如果您有其他问题,您可以重新提出一个问题。已解决!谢谢:)下次提问之前我会考虑很多!嗨,如果我想把一个随机数列表附加到一个普通的列表上怎么办。我该怎么做?例如:一个普通的列表[]
附加一个随机列表[1,2,3]
(这些数字是由函数drawFloat生成的)?@CSnerd如果你想附加一个随机数字列表,你可以创建一个生成随机列表的函数,比如randList=mapM(const$rawFloat 2 10)[1..n]
然后再附加这个函数,比如(lis++)随机列表
@CSnerdrandGrid::Int->Float->IO[Int]
,randGrid n p=(mapM.mapM)(const$singleRandP)$(replicate n.replicate n)1
,其中singleRandP::Float->IO Int
生成具有概率p
的1
。另外,请停止更新同一个问题,如果您有其他问题,您可以重新提出一个问题。已解决!谢谢:)下次提问之前我会考虑很多!