1
我想打印出「純」函數調用產生的值列表的平均值和長度。我已經做了一些相關的研究,並且只是把我的頭埋在牆上。以下代碼有效:Haskell:如何打印純函數結果的多個指標
[... a bunch of other stuff like "doParallelTrades" ...]
simulate :: Int -> Int -> [Double]
simulate numbuyers groupsize =
let buyers = initTraders numbuyers minimum_price maximum_price
sellers = initTraders numbuyers minimum_price maximum_price
in doParallelTrades sellers buyers groupsize
{--
MAIN
--}
getNum :: IO Int
getNum = readLn
main :: IO()
main = do
let prices n = simulate n 0
putStr "How many buyers?"
n <- getNum
start <- getCurrentTime
print "average price = "
print $ average $ prices n
end <- getCurrentTime
print "number of trades:"
print $ length $ prices n
print "Wall Time:"
print (diffUTCTime end start)
但是,這會評估「價格n」兩次,顯然我不想爲大n做評估。我只想評估一次,然後計算並打印平均值,然後打印長度。我試圖改變主要功能:
main = do
let prices n = simulate n 0
putStr "How many buyers?"
n <- getNum
start <- getCurrentTime
p <- prices n -- ***********New Code*********
print "average price = "
print $ average $ p -- ***********New Code**********
end <- getCurrentTime
print "number of trades:"
print $ length $ p -- **********New Code***********
print "Wall Time:"
print (diffUTCTime end start)
即,結合「價格N」到「P」,然後做的東西與對。但是,解釋給我的錯誤
zitraders-threaded.hs:162:8:
Couldn't match expected type ‘IO [Integer]’
with actual type ‘[Double]’
In a stmt of a 'do' block: p <- prices n
我已經研究了各種在線資源,但它們要麼過於簡單或過於複雜(僅在IO單子工作)。那麼我如何:
- 從用戶處獲得一些輸入。
- 在該輸入上運行一些「純粹」計算(只需一次)並存儲結果。
- 告訴用戶該結果的多個屬性。
更改'P < - 價格ñ '讓'p =價格'。 ''<-'語法適用於一元操作 - 在這種情況下,monad是IO,所以出現在'<-'右邊的任何東西都必須具有'IO something'類型。 – user2407038
順便說一句,你可能想'putStrLn'平均價格=''因爲'print'增加了額外的引號。 – chi
感謝您的解釋 – strangeintp