[英]How to reason about space complexity in Haskell
我正試圖找到一種正式的方式來考慮haskell中的空間復雜性。 我發現這篇關於圖形縮減( GR )技術的文章在我看來是一種方法。 但是我在某些情況下應用它時遇到了問題。 請考慮以下示例:
假設我們有一個二叉樹:
data Tree = Node [Tree] | Leaf [Int]
makeTree :: Int -> Tree
makeTree 0 = Leaf [0..99]
makeTree n = Node [ makeTree (n - 1)
, makeTree (n - 1) ]
和兩個遍歷樹的函數,一個( count1 ) 流暢地流動,另一個( count2 )一次在內存中創建整個樹; 根據剖析器。
count1 :: Tree -> Int
count1 (Node xs) = 1 + sum (map count1 xs)
count1 (Leaf xs) = length xs
-- The r parameter should point to the root node to act as a retainer.
count2 :: Tree -> Tree -> Int
count2 r (Node xs) = 1 + sum (map (count2 r) xs)
count2 r (Leaf xs) = length xs
我想我理解它在count1的情況下是如何工作的,這是我認為在圖形縮減方面發生的事情:
count1 $ makeTree 2
=> 1 + sum $ map count1 xs
=> 1 + sum $ count1 x1 : map count1 xs
=> 1 + count1 x1 + (sum $ map count1 xs)
=> 1 + (1 + sum $ map count1 x1) + (sum $ map count1 xs)
=> 1 + (1 + sum $ (count1 x11) : map count1 x1) + (sum $ map count1 xs)
=> 1 + (1 + count1 x11 + sum $ map count1 x1) + (sum $ map count1 xs)
=> 1 + (1 + count1 x11 + sum $ map count1 x1) + (sum $ map count1 xs)
=> 1 + (1 + 100 + sum $ map count1 x1) + (sum $ map count1 xs)
=> 1 + (1 + 100 + count x12) + (sum $ map count1 xs)
=> 1 + (1 + 100 + 100) + (sum $ map count1 xs)
=> 202 + (sum $ map count1 xs)
=> ...
我認為從序列中可以清楚地知道它在恆定的空間中運行,但是在count2的情況下會發生什么變化?
我理解其他語言的智能指針,所以我模糊地理解count2函數中的額外r參數以某種方式保持樹的節點不被破壞,但我想知道確切的機制,或者至少是我可以使用的正式機制其他情況也是如此。
謝謝你的期待。
你可以使用Adam Bakewell的空間語義,
Haskell目前缺乏標准的操作語義。 我們認為應該提供這樣的語義,以便能夠推斷程序的操作屬性,確保實現保證某些空間和時間行為,並幫助確定空間故障的來源。 我們為Core Haskell程序的順序評估提供了一個小步驟確定性語義,並表明它是漸近空間和時間使用的精確模型。 語義是圖形符號的形式化,因此它提供了有用的心理模型以及精確的數學符號。 我們討論它對教育,規划和實施的影響。 使用monadic IO機制擴展基本語義,以便包含實現控制下的所有空間。
或者使用STG機器的Coq規范 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.