簡體   English   中英

如何推理Haskell中的空間復雜性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM