Ich bin die Art, die das Lernen bevorzugt, indem sie Code betrachtet anstatt lange Erklärungen zu lesen. Dies könnte einer der Gründe sein, warum ich lange wissenschaftliche Arbeiten nicht mag. Der Code ist unmissverständlich, kompakt, geräuschlos und wenn Sie nichts bekommen, können Sie einfach damit spielen - Sie müssen den Autor nicht fragen.Ist es möglich, die verschiedenen Bewertungsstrategien zu präsentieren, indem man diesen einfachen Reduzierer modifiziert?
Dies ist eine vollständige Definition des Lambda-Kalküls:
-- A Lambda Calculus term is a function, an application or a variable.
data Term = Lam Term | App Term Term | Var Int deriving (Show,Eq,Ord)
-- Reduces lambda term to its normal form.
reduce :: Term -> Term
reduce (Var index) = Var index
reduce (Lam body) = Lam (reduce body)
reduce (App left right) = case reduce left of
Lam body -> reduce (substitute (reduce right) body)
otherwise -> App (reduce left) (reduce right)
-- Replaces bound variables of `target` by `term` and adjusts bruijn indices.
-- Don't mind those variables, they just keep track of the bruijn indices.
substitute :: Term -> Term -> Term
substitute term target = go term True 0 (-1) target where
go t s d w (App a b) = App (go t s d w a) (go t s d w b)
go t s d w (Lam a) = Lam (go t s (d+1) w a)
go t s d w (Var a) | s && a == d = go (Var 0) False (-1) d t
go t s d w (Var a) | otherwise = Var (a + (if a > d then w else 0))
-- If the evaluator is correct, this test should print the church number #4.
main = do
let two = (Lam (Lam (App (Var 1) (App (Var 1) (Var 0)))))
print $ reduce (App two two)
Meiner Meinung nach ist die „reduce“ über Funktion sagt viel mehr über das Lambda-Kalkül als Seiten von Erklärungen und ich wünsche, dass ich gerade bei aussehen könnte als ich anfing zu lernen. Sie können auch sehen, dass es eine sehr strenge Evaluierungsstrategie implementiert, die sogar innerhalb von Abstraktionen verläuft. Auf diesen Geist, Wie könnte dieser Code geändert werden, um die vielen verschiedenen Bewertungsstrategien zu veranschaulichen, die der LC haben kann (Rufname, Lazy Evaluation, Call-by-Value, Call-by-Sharing, Teilbewertung und bald)?
Sehr interessante Thema, obwohl ich meine Zweifel habe, ob diese Frage nach StackOverflow Richtlinien Thema ist. – leftaroundabout
@leftaroundabout Eigentlich habe ich auch einige Zweifel. Ich denke jedoch, dass es sich um eine Programmierfrage handeln kann, da in der unteren Frage danach gefragt wird, wie der Code an verschiedene Strategien angepasst werden kann (möglicherweise in eleganter Weise). Es geht nicht (nur) um den Lambda-Kalkül. – chi