2015-11-07 81 views
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單子工作)。那麼我如何:

  1. 從用戶處獲得一些輸入。
  2. 在該輸入上運行一些「純粹」計算(只需一次)並存儲結果。
  3. 告訴用戶該結果的多個屬性。
+2

更改'P < - 價格ñ '讓'p =價格'。 ''<-'語法適用於一元操作 - 在這種情況下,monad是IO,所以出現在'<-'右邊的任何東西都必須具有'IO something'類型。 – user2407038

+0

順便說一句,你可能想'putStrLn'平均價格=''因爲'print'增加了額外的引號。 – chi

+0

感謝您的解釋 – strangeintp

回答

4

你不能用價格n,其中的 '< - ' 綁定p運營商,用一個讓來代替:

這應該做的伎倆:

main = do 
    ... 
    start <- getCurrentTime 
    let p = prices n -- ***********New Code********* 
    print "average price = " 
    ...