簡體   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