那么让我来定义一些事情:
type Name = String
data Exp = Var Name
| App Exp Exp
| Lam Name Exp
deriving (Eq,Show,Read)
Run Code Online (Sandbox Code Playgroud)
我想定义alpha-equivalence
,这是
alpha_eq :: Exp -> Exp -> Bool
-- The terms x and y are not alpha-equivalent, because they are not bound in a lambda abstraction
alpha_eq (Var x) (Var y) = False
alpha_eq (Lam x e1) (Lam y e2) = False
alpha_eq (App e1 e2) (App e3 e4) = False
Run Code Online (Sandbox Code Playgroud)
例如Lam "x" (Var "x")
,Lam "y" (Var "y")
两者都是等价的.然而,我既新又可怕Haskell
.有人能给出如何实施的线索alpha_eq
吗?我想到的一件事是Map Name Int
在这种情况下使用,我会:
['x' -> 0] ['y' -> 0]
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下Map['x'] == Map['y']
.但我再次对Haskell很恐怖.你能不能给我一个如何实现它的线索?
是的,使用一个Map
正确的想法(虽然考虑键和值类型应该是什么; Map Name Int
你需要两个额外的参数而不是一个).你需要将它添加为辅助函数的参数,我不会给出完整的实现,因为你只需要一个线索:
alpha_eq e1 e2 = alpha_eq' e1 e2 env0 where
env0 = ???
alpha_eq' (Var x) (Var y) env = ???
alpha_eq' (Lambda x e1) (Lambda y e2) env = ???
alpha_eq' (App e1 e2) (App e3 e4) env = ???
-- you don't want to throw an error in all other cases
alpha_eq' _ _ env = ???
Run Code Online (Sandbox Code Playgroud)