让
import Control.Monad
main = do
forM_ [1..1000] $ \i ->
if mod i 2 == 0 then putStrLn "Foo"
else print i
与
ghc -rtsopts -prof -fprof-auto z.hs && ./z +RTS -p && cat z.prof
然后运行,以下rules to set cost centres
COST CENTRE MODULE %time %alloc
main.\ Main 80.0 84.4
main Main 20.0 13.2
CAF GHC.IO.Handle.FD 0.0 2.1
反斜线表明堆栈层,you can set names for each one
forM_ [1..1000] $ \i ->
{-# SCC "myBranch" #-}
if mod i 2 == 0 then putStrLn "Foo"
else print i
现在
COST CENTRE MODULE %time %alloc
myBranch Main 90.0 84.4
main Main 10.0 13.2
CAF GHC.IO.Handle.FD 0.0 2.1
(新增@trVoldemort评论)
此外,(...)
似乎是用于let
分配与参与
data T = T Int (IO()) (IO())
main =
forM_ [T (mod i 2) (putStrLn "Foo") (print i) | i <- [1..1000]] $ \q ->
let T a b c = q -- Will be `(...)`
in if a == 0 then b else c
使用配置文件输出的计算
main.\ Main
main.\.b Main
main.\.c Main
main.\.(...) Main
main.\.a Main
与SCC编译
forM_ [T (mod i 2) (putStrLn "Foo") (print i) | i <- [1..1000]] $ \q ->
let T a b c = {-# SCC "myBind" #-} q
in if a == 0 then b else c
和输出
main.\.b Main
main.\.c Main
main.\.(...) Main
myBind Main
main.\.a Main
所以,这些都是没有反斜杠,他们是变相lambda表达式。有趣。 – chi
@chi:甚至没有多少伪装,因为这是我们通常对lambda表达式的语法:)。 –
感谢您的好评。在附注中,我意识到'。(...)'后面的'。/'代表一个带有模式匹配的let语句(这意味着它涉及计算)。例如,当你说'let(a,b)= myFunc'或者'让Just x = lookup ...'等 – trVoldemort