我寫了下面的功能..和執行使用WinHugs是否可以使用WinHugs打印Haskell中的所有縮減?
teneven = [x | x <- [1..10], even x]
我的輸出:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
反正是有打印所有削減..所以我可以學習的核心評價內部發生WinHugs?
我寫了下面的功能..和執行使用WinHugs是否可以使用WinHugs打印Haskell中的所有縮減?
teneven = [x | x <- [1..10], even x]
我的輸出:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
反正是有打印所有削減..所以我可以學習的核心評價內部發生WinHugs?
一些想法:
調試命令行選項(你可以在擁抱:set +d
設置)爲信息,但很冗長,不顯示你在Haskell語法的削減。
嘗試Hat - the Haskell Tracer。我只是嘗試了一個簡單的程序,它非常酷。儘管我不在Windows上,但我不知道讓它運行有多困難。這很可能相當困難,這很令人遺憾,因爲它很酷,基本上就是你想要的。如果你得到它的運行,你可以從紅帽得到這樣的信息:
main = {IO}
teneven = [2,4,6,8,10]
_foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
(\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
(\..) 2 [4,6,8,10] = [2,4,6,8,10]
(\..) 3 [4,6,8,10] = [4,6,8,10]
(\..) 4 [6,8,10] = [4,6,8,10]
(\..) 5 [6,8,10] = [6,8,10]
(\..) 6 [8,10] = [6,8,10]
(\..) 7 [8,10] = [8,10]
(\..) 8 [10] = [8,10]
(\..) 9 [10] = [10]
(\..) 10 [] = [10]
拉姆達有even
。另外,如果你願意,Hat可以追蹤foldr
和其他內部電話的呼叫;默認情況下,它不會這樣做。
相信我,你不想走這條路。
在每個特定情況下使用的減少集(和順序)將取決於特定的語言實現(擁抱可以做到這一點,ghci - 換句話說,jhc-在另一個方面等)。
更好地閱讀一些有關的一般方式來實現編譯器/解釋/ virual機功能性的語言 - 像SECD機等
幾個環節:
這裏有幾個使用Debug.Trace和Hugs.Observe的例子。
import Debug.Trace
fact :: Integer -> Integer
fact 0 = trace "fact 0 ->> 1" 1
fact n = trace ("fact " ++ show n) (n * fact (n-1))
import Hugs.Observe
fact :: Integer -> Integer
fact 0 = observe "fact 0" 1
fact n = observe "fact n" (n * fact (n-1))
希望這可以幫助您弄清楚如何使用WinHungs打印所有縮小。
不幸的是,帽子似乎沒有在ghc 7.8.3上編譯,開發似乎在2012年11月13日停止。 – 2014-11-24 05:48:37