2014-10-06 23 views
14

Opiszę to pytanie, używając przykładu z książki.Drukowanie kroków Haskella do oceny (przepisywania) w celach edukacyjnych/edukacyjnych. Czy to możliwe?

W książce Simona Thompsona "HASKELL rzemiosło programowania funkcjonalnego" na stronie 82 (patrz zdjęcia poniżej) pokazano etapy oceny dla fac 4.

PYTANIE:

Czy to możliwe, aby korzystać z niektórych funkcji lub jakiś „Haskell debugger”, który będzie pisać etapy oceny, które GHCi używa kiedy to ocenić wartość fac 4?

Najlepiej w formacie czytelnym dla człowieka, do celów edukacyjnych i edukacyjnych.

Byłoby również dobrze mieć pewne automatyczne wyjaśnienie dla każdego etapu oceny, na przykład, które równanie zostało użyte w etapie przepisywania.

Moim głównym celem jest lepsze zrozumienie, w jaki sposób wykonywane są etapy przepisywania, gdy uruchamiam proste przykładowe programy edukacyjne Haskella (np. fac).

Czy istnieje sposób, aby to zrobić? Jeśli tak, w jaki sposób?

enter image description here

enter image description here

+0

[Prosta refleksja] (https://hackage.haskell.org/package/simple-reflect) może to zrobić. Ale podczas gdy jest to przydatne dla prostych rzeczy, takich jak listy i mapy, nie działa na wszystko. – genisage

+0

możesz przekonwertować go na Prolog (zwariowany pomysł;) i [wyśledzić] (http://i.imgur.com/AKCFefx.png) tam ... (pokazano graficzny debugger SWI-Prolog). Działa dla najprostszych rzeczy. BTW książka pomija kilka kroków (wartości nie są wymuszane od razu, ale tylko w porównaniu z zero). Prolog - ponieważ jego zasady są również oparte na klauzulach. –

Odpowiedz

9

Tak i nie. nie widziałem jeszcze narzędzie, które ma tę ocenę wiersz po wierszu, który jest przedstawiony w podręczniku - głównie dlatego, program Haskella nie "przepisuje" wyrażeń.

Istnieje jednak narzędzie, które wizualizuje aktualną strategię oceny Haskella, krok po kroku: ghc-vis. Zamiast oceniać wynik i wyświetlać go na konsoli, tak jak to robi ghci, wyświetla graficzną reprezentację nieocenionego wyniku - i możesz wymusić ocenę tego uderzenia przez thunk, aż dojdziesz do prymitywnych wartości i struktur.

Jako przykład tego, co może zrobić, oto ocena aż do trzeciego członka lista nieskończonego ciągu Fibonacciego:

0, 1 and 1 are evaluated, the rest of the list is a thunk referring back to parts of the list itself http://felsin9.de/nnis/ghc-vis/fib1.svg

Źródło: examples section of the project website. Powinieneś rzucić okiem na nich wszystkich!

+0

Czy radzi sobie z pełnym Haskellem? Na przykład z klasami typów i Monadami? Chciałbym zobaczyć wizualizację pracy monad stanów w wykładach wideo Briana Beckmana. – jhegedus

+0

To może być nawet bardziej edukacyjne niż zobaczenie kroków przepisywania! – jhegedus

+0

Bardziej konkretnie, wykłady wideo Briana Beckmana są dostępne tutaj: http://channel9.msdn.com/Shows/Going+Deep/Brian-Beckman-The-Zen-Expressing-State-The-State-Monad). – jhegedus

1

To jest dużo-pożądane i bardzo przydatna funkcja — które, jak najlepiej, co wiem, nie jest dostępny wszędzie. :-(

+7

"Czy można to zrobić?" "Nie." Jak to nie odpowiada na pytanie? – MathematicalOrchid

+1

Oczywiście można to zrobić. Nie znam żadnego narzędzia, które by mi się podobało, ale nie ma powodu, żebyś nie mógł go napisać. – genisage

+0

Oczywiście możliwe jest przeżycie 100 lat z rakiem z przerzutami, po prostu trzeba znaleźć lekarstwo na to. Nie ma powodu, dla którego nie mógłbyś go znaleźć. – jhegedus

10

Istnieje narzędzie o nazwie Lambda bubble pop, w którym można kliknąć wyrażenie, aby zobaczyć, jak redukuje się wyrażanie.Zauważ, że narzędzie obsługuje tylko liczby całkowite i listy, ale mimo to jest dobrym narzędziem edukacyjnym.

Snapshot narzędzia w akcji:

enter image description here

+0

Wygląda interesująco. Czy to klasy typu wsparcia? Monady? Algebraiczne typy danych? Wygląda na to, że może spowodować awarię Safari. – jhegedus

+0

Hmmm, wydaje się, że żadna z tych bardziej zaawansowanych koncepcji nie jest jeszcze wdrożona. – jhegedus