Advertisement
Guest User

Untitled

a guest
Jun 12th, 2019
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Data.List
  2.  
  3. type Variable = String
  4.  
  5. data Expr = Var Variable
  6.           | Lambda Variable Expr
  7.           | Ap Expr Expr
  8.             deriving (Show, Read, Eq, Ord)
  9.  
  10. -- De Bruijn indexing
  11. data DExpr = DVar Int
  12.            | DLambda DExpr
  13.            | DAp DExpr DExpr
  14.              deriving (Show, Read, Eq, Ord)
  15.  
  16. -- What is a more idiomatic way to do this?
  17. toDeBruijn_ :: [String] -> Expr -> DExpr
  18. toDeBruijn_ vars (Var v) = maybe (
  19.                             error $ "Unexpected free variable `" ++ v ++ "`"
  20.                           ) DVar $ findIndex (== v) vars
  21. toDeBrujin_ vars (Lambda v e) = toDeBrujin_ (v:vars) e
  22. toDeBrujin_ vars (Ap f x) = DAp (toDeBrujin_ vars f) (toDeBrujin_ vars x)
  23. toDeBrujin_ vars a = error ("Unexpected `" ++ show a ++ "`")
  24.  
  25. toDeBrujin :: Expr -> DExpr
  26. toDeBrujin = toDeBrujin_ []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement