Ho un set di espressioni lambda che sto passando ad altri lambda. Tutti i lambda fanno affidamento solo sui loro argomenti, non chiamano nessuna funzione esterna. Certo, a volte diventa abbastanza confuso e passerò una funzione con il numero errato di argomenti a un altro, creando un'eccezione GHCi.Haskell esegue il debug di un'espressione lambda arbitraria
Desidero eseguire una funzione di debug che esegua un'espressione lambda arbitraria (con un numero sconosciuto di argomenti) e restituisca una stringa in base alla struttura e alla funzione del lambda.
Per esempio, dire che ho le seguenti espressioni lambda:
i = \x -> x
k = \x y -> x
s = \x y z -> x z (y z)
debug (s k)
dovrebbe restituire "\a b -> b"
debug (s s k)
dovrebbe restituire "\a b -> a b a"
(se ho semplificato che correttamente)
debug s
dovrebbe restituire "\a b c -> a c (b c)"
Wha sarebbe un buon modo per farlo?
Non proprio in Haskell, questo tipo di informazioni viene cancellato al momento della compilazione. È possibile utilizzare template haskell per implementarlo, probabilmente, ma non è semplice. – bheklilr
Ci sono molte risorse per implementare il calcolo lambda là fuori. [TaPL] (http://www.cis.upenn.edu/~bcpierce/tapl/) è particolarmente buono e include implementazioni di calcoli di diversi livelli di sofisticazione. Ci sono anche alcune piccole implementazioni su Hackage con cui potresti giocare. –
Haskell è un linguaggio tipizzato staticamente. In realtà non è quel calcolo lambda profondamente coinvolto, tranne nella misura in cui lambdas è un modo utile per scrivere le espressioni di una categoria chiusa cartesiana. Ma è molto più produttivo usare direttamente i tipi per avere un'idea di cosa fa una funzione, piuttosto che guardare un'espressione lambda equivalente. Per quello che stai cercando di ottenere, un linguaggio come Scheme sarebbe più adatto. – leftaroundabout