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