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

Содержимое удалено Содержимое добавлено
Исправления к модулю на Haskell
Строка 320:
 
<code>data Combinator = Var String
| App Combinator Combinator
| Lam String Combinator
deriving Eq</code>
 
Строка 341:
 
<code>instance Show Combinator where
show (Var x) = x
show (App x y) =
case y of
App _ _ -> showLam x ++ "(" ++ show y ++ ")"
_ -> showLam x ++ showLam y
where showLam l@(Lam _ _) = "(" ++ show l ++ ")"
showLam x = show x
show (Lam x e) = "\\" ++ x ++ "." ++ show e</code>
 
 
Строка 367 ⟶ 368 :
определяется так:
 
<code>free :: [Char]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 = falseFalse</code>
 
Всё в полном соответствии с математическим определением.
Строка 383 ⟶ 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 y_ e_))@l) = transform (Lam x (transform l))
transform (Lam x (App e1 e2)) = App (App s (transform (Lam x e1)))
(transform (Lam x e2))</code>
 
</code>
 
Видно, что определение этой функции полностью совпадает с описанием