List 总结Haskell中的IO浮点:[IO浮点]列表
所以我和Haskell玩了一会儿,试着自己学。我试图解决一个特定的问题,我应该创建一个随机数列表,然后将它们相加 我有生成它们的代码-使用List 总结Haskell中的IO浮点:[IO浮点]列表,list,haskell,functional-programming,sum,monads,List,Haskell,Functional Programming,Sum,Monads,所以我和Haskell玩了一会儿,试着自己学。我试图解决一个特定的问题,我应该创建一个随机数列表,然后将它们相加 我有生成它们的代码-使用getStdRandom和randomR。使用它们都会返回IO浮点值的列表:[IO浮点值] 现在,当我尝试使用例如foldl或foldr对列表进行求和,甚至尝试一个简单的递归求和时,我会出现错误,据我所知,这是因为IO Float是一个单子,所以我需要做一些Haskell魔术来让它工作 我一直在谷歌上搜索,还没有找到有效的东西 有没有办法总结一下这个清单?或者
getStdRandom
和randomR
。使用它们都会返回IO浮点值的列表
:[IO浮点值]
现在,当我尝试使用例如foldl或foldr对列表进行求和,甚至尝试一个简单的递归求和时,我会出现错误,据我所知,这是因为IO Float
是一个单子,所以我需要做一些Haskell魔术来让它工作
我一直在谷歌上搜索,还没有找到有效的东西
有没有办法总结一下这个清单?或者甚至将其转换为一个浮点列表,以便在代码的其他部分更容易处理?请注意,类型为
[IO Float]
的列表不是一个数字列表。它是生成数字的I/O操作的列表。I/O还没有执行,所以在您的例子中,随机数生成器实际上没有生成数字
您可以使用该函数将IO操作列表合并为一个IO操作,该操作提供一个结果列表:
do the_numbers <- sequence your_list
return $ sum the_numbers
如注释中所述,您还可以利用以下事实:每个
单子
也是一个函子
(这在较新版本中强制执行),因此您可以使用在IO内应用函数:
fmap sum (sequence your_list)
或者使用中缀同义词:
sum sequence您的_列表
请注意,类型为[IO Float]
的列表不是一个数字列表。它是生成数字的I/O操作的列表。I/O还没有执行,所以在您的例子中,随机数生成器实际上没有生成数字
您可以使用该函数将IO操作列表合并为一个IO操作,该操作提供一个结果列表:
do the_numbers <- sequence your_list
return $ sum the_numbers
如注释中所述,您还可以利用以下事实:每个
单子
也是一个函子
(这在较新版本中强制执行),因此您可以使用在IO内应用函数:
fmap sum (sequence your_list)
或者使用中缀同义词:
sum sequence您的_列表
使用liftM进行如下操作如何:
import System.Random
import Control.Monad
rnd :: IO Float
rnd = getStdRandom (randomR (0.0,1.0))
main = do
let l = map (\_ -> rnd) [1..10]
n <- foldl (liftM2 (+)) (return (0 :: Float)) l
print n
导入系统。随机
进口管制
rnd::IO浮点
rnd=getStdRandom(随机数(0.0,1.0))
main=do
设l=map(\ \ \->rnd)[1..10]
n使用liftM进行如下操作如何:
import System.Random
import Control.Monad
rnd :: IO Float
rnd = getStdRandom (randomR (0.0,1.0))
main = do
let l = map (\_ -> rnd) [1..10]
n <- foldl (liftM2 (+)) (return (0 :: Float)) l
print n
导入系统。随机
进口管制
rnd::IO浮点
rnd=getStdRandom(随机数(0.0,1.0))
main=do
设l=map(\ \ \->rnd)[1..10]
n请添加您拥有的代码-解决方案可能简单到sum whateverYouHaveNow
请添加您拥有的代码-解决方案可能简单到sum whateverYouHaveNow
第一个do
语句可以简化为fmap sum(sequence yourList)
或sum sequence yourList
。(其中和()=fmap
)“不是数字列表”——准确地说。查看这一点的一个简单方法是对列表进行多次评估排序:每次都会得到不同的结果!第一个do
语句可以简化为fmap sum(sequence yourList)
或sum sequence yourList
。(其中和()=fmap
)“不是数字列表”——准确地说。查看这一点的一个简单方法是对列表进行多次评估排序:每次都会得到不同的结果!