繁体   English   中英

总结IO浮动列表:[Haskell中的[IO Float]

[英]Summing up a list of IO Float: [IO Float] in Haskell

所以我在和Haskell鬼混,试图自己学习。 我正在尝试解决一个特定的问题,我应该在其中创建一个随机数列表,然后对其进行汇总。

我有生成它们的代码-使用getStdRandomrandomR 都使用它们都返回IO Float的列表: [IO Float]

现在,当我尝试使用foldl或foldr来汇总列表,甚至尝试简单的递归求和时,都会遇到错误等-据我了解,这是因为IO Float是monad,所以我需要做一些Haskell魔术使它工作。

我一直在四处搜寻,却没有找到有效的方法。

有什么办法汇总清单? 甚至将其转换为浮点数列表,以便其在代码的其他部分更容易解决?

请注意,类型为[IO Float]的列表不是数字列表。 它是生成数字的I / O操作的列表。 该I / O尚未执行,因此在您的情况下,随机数生成器实际上尚未生成数字。

您可以使用sequence :: Monad m => [ma] -> m [a]函数将IO操作列表组合为一个提供结果列表的IO操作:

do the_numbers <- sequence your_list
   return $ sum the_numbers

或者,您可以使用foldM函数编写单折:

sumIONumbers :: [IO Float] -> IO Float
sumIONumbers xs = foldM f 0.0 xs
  where
    f acc mVal = do
      val <- mVal  -- extract the Float from the IO
      return $ acc + val

如评论中所述,您还可以利用以下事实:每个Monad也是Functor (在新版本中强制执行),因此您可以使用fmap :: Functor f => (a -> b) -> fa -> fb在IO中应用功能:

fmap sum (sequence your_list)

或使用中缀同义词<$>

sum <$> sequence your_list

如何使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM