Комбинаторы — это просто!: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 369:
 
<code>free :: String -> Combinator -> Bool
free x (Var y) = x == y
free x (App e1 e2) = free x e1 || free x e2
free x (Lam y e) | x /= y = free x e
| x == y = False</code>
 
Всё в полном соответствии с математическим определением.
Строка 384:
 
<code>transform :: Combinator -> Combinator
transform (Var x) = Var x
transform (App x y) = App (transform x)
(transform y)
transform (Lam x (Var y))
| x == y = i
| otherwise = App k (Var y)
transform (Lam x (l@(Lam _ _))) = transform (Lam x (transform l))
transform (Lam x (App e1 e2)) = App (App s (transform (Lam x e1)))
(transform (Lam x e2))</code>
 
Видно, что определение этой функции полностью совпадает с описанием