List 总结Haskell中的IO浮点:[IO浮点]列表

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魔术来让它工作 我一直在谷歌上搜索,还没有找到有效的东西 有没有办法总结一下这个清单?或者

所以我和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
)“不是数字列表”——准确地说。查看这一点的一个简单方法是对列表进行多次评估
排序:每次都会得到不同的结果!