Понимание функции eval, используемой для определения комбинаторов и выражений (лямбда) в Haskell - PullRequest
0 голосов
/ 26 января 2019

Я считаю использование сопоставления с образцом для eval (App x y) избыточным, поскольку оба случая вернут App x y.Интересно, нужен ли eval (App x y) вообще, потому что у нас есть eval x = x в конце, который также должен включать eval (App x y)

data Expr = App Expr Expr | S | K | I | Var String | Lam String Expr deriving (Show,Eq)
eval :: Exp -> Exp
eval (App I x) = eval x 
eval (App (App K x) y) = eval x
eval (App (App (App S f) g) x) = eval (App (App f x) (App g x))
eval (App x y)
 | evalx == x  = (App evalx (eval y)) --test if x is a Lam (not other possible values of Exp)
 | otherwise = eval (App evalx y)
     where evalx = eval x
eval (Var x) = (Var x)
eval x = x  
...