Haskell - determine set of free and bounded variables of a function -
i have determine set of free , bounded variables of function s1 , s2:
s1 := \x -> if y \z -> (x \y -> y) else (\z -> w) x so, s1 i'll write:
fv(s1):= fv (y) ∪ fv (x) ∪ fv (w) am correct? or should be:
fv(s1):= fv (y) ∪ fv (x) ∪ fv (y) ∪ fv (w) ∪ fv (x) since y , x 2 times free. once y in if , result of -> y , x: x free once in result of \z , second @ end.
the bounded variables be:
bv(s1):= bv (x) ∪ bv (z) ∪ bv (y) ∪ bv (z) since z occurs twice bounded var.
in same way i'd determine fvs , bvs of s2:
s2 := let f x1 x2 = y1 (\x -> x2) in let y1 = f w (f y2 y2), y2 = y1 in f fv(s2):= fv (y1) ∪ fv (x2) ∪ fv (w) ∪ fv (y1) bv(s2):= bv (f) ∪ bv (x1) ∪ bv (x2) ∪ bv (x) ∪ bv (y1) could please tell me whether i'm correct or wrong?
thanks in advance
general idea: bound vs free variables
a rule of thumb free , bound variables value of free variable affects value of expression.
for simple example, if defined identity x = x , separately said x = 6, wouldn't change fact identity 10 10; in identity x = x, variable x bound because stands whatever input there is. can write identity y = y without changing meaning of function.
conversely, if define gimmez x = z, z isn't bound. if separately z = 6 gimmez different if said z = putstrln "zed zed zed zed can tell i'm british?", or gimmez x = zz. in either case, function gimmez has changed - z wasn't bound.
can find-and-replace varname othervarname without changing meaning?
- yes -
varnamebound. - no -
varnameappears free in expression.
let's @ actual examples
example 1
s1 := \x -> if y \z -> (x \y -> y) else (\z -> w) you wrote fv(s1):= fv (y) ∪ fv (x) ∪ fv (w) or fv(s1):= fv (y) ∪ fv (x) ∪ fv (y) ∪ fv (w) ∪ fv (x)
let's @ variables in turn
- the initial
\x ->bindsxscope of lambda - end of line. it's not free variable @ all. yfree afterif, bound in invalid expression(x \y -> y). second occurrence in bracket has value of bound y, rather free one. obliteration of otherwise free variable called shadowing.yfree in expression, because of first appearance.zbound in final lambda expression.wisn't bound anywhere - it's free.
summary: y , z free. x , z bound, y shadowed - occurs bound variable later in expression. fv(s1) = {y,z}, , bv(s1)={x,z,y}
notation
i disagree use of notation fv(s1):= fv (y) ∪ fv (w). suggests find free variables of s1 should @ free variables of y , w. disagree - y , z are free variables of s1. true if wanted free variables of module in s1 defined need add fv (y) ∪ fv (w), that's different question.
(the notation ∪ indicates set union. things either in or out of set, don't need add them multiple times.)
example 2
s2 := let f x1 x2 = y1 (\x -> x2) in let y1 = f w (f y2 y2), y2 = y1 in f the let f x1 x2 = binds f, x1 , x2, if f feels different; introduce new variable shadow external definition same name, , find-and-replacing them in expression wouldn't change meaning, they're bound.
f,x1,x2boundlet.y1free first time appears - secondletbinding not in scope here.xbound lambday1boundlet(more shadowing)wfreey2looks free @ first, retrospectively bound in expressiony2 = y1
fv(s2):= {y1, w} bv(s2):= {f, x1, x2, x, y1, y2}
Comments
Post a Comment