讓
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