簡體   English   中英

查看Haskell中的減少步驟

[英]View Reduction Steps in Haskell

有沒有辦法查看haskell中的還原步驟,即跟蹤所做的遞歸函數調用? 例如,chez方案為我們提供了trace-lambda。 Haskell中有一個等價的形式嗎?

您可以嘗試在要跟蹤的位置插入Debug.Trace.trace ,但這會導致(a)產生非常無序的輸出,因為您的trace語句可能屬於直到遠未評估的thunk遠離原始調用,以及(b)更改程序的運行時行為,如果跟蹤需要評估本來不會被評估的事情(尚未)。

這是用於調試嗎? 如果是這樣的話...


Hat會修改您的源代碼以輸出可在運行后查看的跟蹤。 輸出應該非常接近你想要的:他們主頁上的例子是

例如,計算錯誤程序

 main = let xs :: [Int] xs = [4*2,5 `div` 0,5+6] in print (head xs,last' xs) last' (x:xs) = last' xs last' [x] = x 

給出結果

 (8, No match in pattern. 

並且可以使用Hat查看工具來探索其行為,如下所示:

  • 帽子堆棧

對於中止的計算,即以錯誤消息終止或被中斷的計算,帽子堆棧顯示計算被中止的函數調用。 它通過顯示函數調用的虛擬堆棧(redexes)來實現。 因此,堆棧上顯示的每個函數調用都會導致上面的函數調用。 頂部堆棧元素的評估導致錯誤(或在其評估期間計算被中斷)。 顯示的堆棧是虛擬的,因為它不對應於實際的運行時堆棧。 實際運行時堆棧啟用延遲評估,而虛擬堆棧對應於將用於急切(嚴格)評估的堆棧。

使用與上面相同的示例程序,帽子堆棧顯示

 $ hat-stack Example Program terminated with error: No match in pattern. Virtual stack trace: (Last.hs:6) last' [] (Last.hs:6) last' [_] (Last.hs:6) last' [_,_] (Last.hs:4) last' [8,_,_] (unknown) main $ 

目前,GHCi(≥6.8.1)還附帶一個調試器:

$ ghci -fbreak-on-exception
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> :l Example.hs
[1 of 1] Compiling Main             ( Example.hs, interpreted )

Example.hs:5:0:
    Warning: Pattern match(es) are overlapped
             In the definition of `last'': last' [x] = ...
Ok, modules loaded: Main.
*Main> :trace main
(8,Stopped at <exception thrown>
_exception :: e = _
[<exception thrown>] *Main> :back
Logged breakpoint at Example.hs:(5,0)-(6,12)
_result :: t
[-1: Example.hs:(5,0)-(6,12)] *Main> :hist
-1  : last' (Example.hs:(5,0)-(6,12))
-2  : last' (Example.hs:5:15-22)
-3  : last' (Example.hs:(5,0)-(6,12))
-4  : last' (Example.hs:5:15-22)
-5  : last' (Example.hs:(5,0)-(6,12))
-6  : last' (Example.hs:5:15-22)
-7  : last' (Example.hs:(5,0)-(6,12))
-8  : main (Example.hs:3:25-32)
-9  : main (Example.hs:2:17-19)
-10 : main (Example.hs:2:16-34)
-11 : main (Example.hs:3:17-23)
-12 : main (Example.hs:3:10-33)
<end of history>
[-1: Example.hs:(5,0)-(6,12)] *Main> :force _result
*** Exception: Example.hs:(5,0)-(6,12): Non-exhaustive patterns in function last'

[-1: Example.hs:(5,0)-(6,12)] *Main> :back
Logged breakpoint at Example.hs:5:15-22
_result :: t
xs :: [t]
[-2: Example.hs:5:15-22] *Main> :force xs
xs = []

雖然不那么好,但它具有易於使用的優點,並且無需重新編譯代碼即可使用。

如果有幫助的話,擁抱減少了嗎? 或者,您是否可以使用類似擁抱罩的東西來包裝您的代碼,以獲得有關它在每一步中所做的更多細節?

Haskell標准中沒有構建任何類型的東西。

我希望Helium圖形解釋器可以提供類似這樣的東西,但網頁對這個主題保持沉默。

部分解決方案是使用真空來可視化數據結構。

我已經看過折疊,掃描和其他的一些gif動畫,但我現在找不到它們。 我認為Cale Gibbard制作了動畫片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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