ist es möglich, alle Reduzierungen in Haskell drucken - mit WinHugs?
-
03-07-2019 - |
Frage
Ich habe die folgende Funktion geschrieben .. und ausgeführt unter Verwendung WinHugs
teneven = [x | x <- [1..10], even x]
Meine Ausgabe:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
ist es trotzdem alle Reduzierungen zu drucken .. so kann ich die Kern Auswertung geschieht innerhalb WinHugs lernen?
Lösung
Einige Ideen:
-
Die Debug-Befehlszeilenoption (die Sie mit
:set +d
in Umarmungen festlegen) ist informativ, aber es ist sehr ausführlich und nicht Ihnen die Kürzungen in Haskell Syntax zeigen. -
Versuchen Sie Hat - die Haskell Tracer . Ich habe gerade versucht es auf einem einfachen Programm und es ist ziemlich cool. Ich bin nicht auf Windows, aber, und ich weiß nicht, wie schwierig es sein würde, es zu bekommen läuft. Es ist wahrscheinlich ziemlich schwierig, was schade ist, da es kühl ist und im Wesentlichen, was Sie wollen. Wenn Sie das tun bekommen es läuft, können Sie so etwas wie diese Informationen von Hat erhalten:
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]
Das Lambda gibt es
even
. Auch, wenn Sie möchten, können Habe verfolgen in Aufrufe vonfoldr
und anderen internen Anrufen; Standardmäßig ist es das nicht.
Andere Tipps
Hier haben Sie einige Beispiele für die Verwendung von Debug.Trace und 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))
Hope dies hilft Ihnen herauszufinden, wie alle Reduktionen mit WinHungs drucken.
Glauben Sie mir, Sie nicht wollen, diesen Weg zu gehen.
Set (und Reihenfolge) der in jedem einzelnen Fall verwendeten Kürzungen würde auf bestimmte Sprache Umsetzung abhängen (Umarmungen könnten es eine Art und Weise tun, GHCI - in anderer Art und Weise, jhc - noch in einer anderen, usw.)
.Besser etwas über allgemeine Möglichkeiten lesen Compiler / Interpreter / virual Maschine für funktionale Sprache zu implementieren -. Wie Secd-Maschine, etc
Mehrere Verbindungen:
- Wikipedia, Secd-Maschine
- Lambda the Ultimate Die Implementierung schnell Dolmetscher