![](/img/trans.png)
[英]Printing out Haskell's evaluation (rewriting) steps for educational/learning purposes. Is it possible?
[英]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.