[Haskell-cafe] Re: Debugging partial functions by the rules
Jón Fairbairn
jon.fairbairn at cl.cam.ac.uk
Wed Nov 15 10:39:53 EST 2006
"Neil Mitchell" <ndmitchell at gmail.com> writes:
> Hi
>
> Haskell is great for equational reasoning.
>
> > blah the_v_in_scope blah
> > where (the_v_in_scope:_) = [ v | (n,v) <- env, n==target ]
>
> This piece of code isn't.
Strange. It's semantically the same, isn't it? Indeed, the
definition of head gets you to it.
> If you used head then you could trivially inline
> the_v_in_scope, this way is a lot harder.
I don't follow that at all. I don't do inlining, the
compiler does. Or are you talking about the inlining that
was originally there and my version explicitly removed?
> You might spot a pointfree pattern and lift it up. You
> might move code around more freely. Lots of patterns like
> this breaks the equational reasoning in the style that
> most people are used to.
To convince me of that, you'd have to convince me that (head
[]) doesn't break the equational reasoning.
> > and it doesn't seem /that/ great an imposition.
>
> I disagree, this is a massive imposition, and requires
> lots of refactoring,
"lots" is in the eye of the beholder. You only have to do
this where you would have used head -- and if you can
already /prove/ that head won't fail, there's no reason to
replace it. So it's only necessary in cases where the proof
is absent.
> and is just a little bit ugly.
Sure, I don't dispute that. I was merely suggesting that
one can already do this for the uncertain cases, rather than
have to invoke a whole other set of new machinery just to
get a line number in the error message.
Your headNote is a good approach, but it strikes me that
it's a bit redundant. Instead of “headNote "foo"” just use
“headDef (error "foo")”. It's a wee bit longer, but having
the “error” out there in the open seems more honest somehow,
and there would be fewer function names to remember.
--
Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk
More information about the Haskell-Cafe
mailing list