On Nov 15, 2006, at 9:48 AM, Jón Fairbairn wrote:

Simon Peyton-Jones <[EMAIL PROTECTED]> writes:

| The problem I see is that head/fromJust errors are usually
|caused by *beginner* Haskellers, who don't know the
|techniques for statically avoiding them.

I don't agree.  My programs have invariants that I can't
always express in a way that the type system can
understand. E.g. I know that a variable is in scope, so
searching for it in an environment can't fail:
        head [ v | (n,v) <- env, n==target ] (Maybe if I had
an Oleg implant I could express all this in the type system
-- but I don't.)

But instead of “blah (head [ v | (n,v) <- env, n==target ])
blah”, you could write

blah the_v_in_scope blah
where (the_v_in_scope:_) =  [ v | (n,v) <- env, n==target ]

and get a source-code located error message, couldn't you?
It's not very high tech, but it's what you would write if
head didn't exist, and it doesn't seem /that/ great an
imposition.

Or how about.... ??

lookupVarible target env =
   case [ v | (n,v) <- env, n==target ] of
      (x:_) -> x
_ -> assert False $ "BUG: Unexpected variable out of scope "++ (show target)++" in environment "++(show env)


 ... lookupVariable target env ....


It seems to me that every possible use of a partial function has some (possibly imagined) program invariant that prevents it from failing. Otherwise it is downright wrong. 'head', 'fromJust' and friends don't do anything to put that invariant in the program text.

Custom functions like the above 1) give you a great opportunity to add a meaningful assertion AND document the program invariant 2) attach some semantic meaning to the operation by naming it 3) make you think about what you're doing and help you avoid writing bugs in the first place 4) give you nice hooks for replacing your data- structure with a better one later, should it be necessary 5) encourage you to break down larger functions into smaller ones.

Big win if you ask me. The frequent use of partial functions from the Prelude counters all of these advantages, and I avoid them as much as possible.


--
Jón Fairbairn [EMAIL PROTECTED]




Rob Dockins

Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
          -- TMBG



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to