2015-11-07 28 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 = " 
    ...