Jestem typem, który preferuje naukę, patrząc na kod, zamiast czytać długie wyjaśnienia. To może być jeden z powodów, dla których nie lubię długich prac naukowych. Kod jest jednoznaczny, zwarty, pozbawiony szumów, a jeśli czegoś nie dostajesz, możesz po prostu grać z nim - nie trzeba pytać autora.Czy jest możliwe zaprezentowanie różnych strategii oceny poprzez modyfikację tego prostego reduktora?
Jest to pełna definicja rachunek lambda:
-- 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)
Moim zdaniem funkcja „zmniejszyć” powyżej mówi znacznie więcej o rachunek lambda niż stron wyjaśnień i chciałabym po prostu patrzeć na kiedy zacząłem się uczyć. Możesz także zobaczyć, że wdraża bardzo rygorystyczną strategię oceny, która idzie nawet w obrębie abstrakcji. W tym duchu, jak zmodyfikować ten kod, aby zilustrować wiele różnych strategii ewaluacyjnych, które może mieć LC (wywołanie przez nazwę, leniwą ocenę, wywołanie po wartości, wywołanie przez dzielenie, częściową ocenę i wkrótce)?
Bardzo ciekawy temat, choć mam wątpliwości, czy to pytanie dotyczy tematu zgodnie z wytycznymi StackOverflow. – leftaroundabout
@leftaroundabout Właściwie, mam również pewne wątpliwości. Uważam jednak, że można to potraktować jako pytanie programistyczne, ponieważ pytanie na dole pyta o to, jak dostosować kod do kilku strategii (być może w elegancki sposób). To nie jest (tylko) o rachunku lambda. – chi