free variable

Jon Fairbairn Jon.Fairbairn@cl.cam.ac.uk
Thu, 09 Aug 2001 11:16:16 +0100


> Hi,

Hi. This sort of question belongs on haskell-caf=E9. I've
copied this reply there.

> I still have confusing regarding the following case:
> =

> elemNum2 :: Int -> [Int] -> Int
> elemNum2 elem list =3D sum [ 1 | findElem <- list, elem =3D=3D findElem=
 ]
> =

> the function I wrote finds the number of occurences of an element in a =
list.
> If I change it to the following:
> =

> elemNum2 elem list =3D sum [ 1 | elem <- list ]
> =

> Now it simply gives the length of the list. OK I understand that "elem"=
 in
> the list comprehension defines a new variable on the fly. What I do not=

> understand is in the first case:
> =

> "findElem <- list" findElem is a new variable, but "list" is not.
> "elem=3D=3DfindElem" here for some reason "elem" is not a new variable.=

> =

> Why does the rule only apply for "<-" operation, but not "=3D=3D" for e=
xample?
> =

> Thanks

<- and let ... =3D ... aren't operations, they're
definitions. =3D=3D is the usual comparison operator.

A list comprehension includes both definitions and
predicates -- expressions of type Bool, or if you prefer,
"operations returning" Bool. Definitions are either "let
<var> =3D <expr>", as in

  [a | let a =3D 1],

which evaluates to [1], or <var> <- <expr> where expr:: [t]
for some t. You can read <- as "drawn from"

  [a | a <- [1,2,3]]

evaluates to [1,2,3], and if we add a predicate:

  [a | a <- [1,2,3], odd a]

evaluates to [1,3] and

  [a | a <- [1,2,3], a =3D=3D 1]      =


evaluates to [1]

Hope that helps

  J=F3n

-- =

J=F3n Fairbairn                                 Jon.Fairbairn@cl.cam.ac.u=
k
31 Chalmers Road                                         jf@cl.cam.ac.uk
Cambridge CB1 3SZ            +44 1223 570179 (after 14:00 only, please!)