I definitely like that idea.  :-)  Is this similar to the notion of dependent 
types?

Cheers,
Greg


On May 4, 2010, at 11:21 AM, Kyle Murphy wrote:

> This whole thing seems to be touching on something I saw recently and was 
> quite interested in. I found a site talking about static contract checking in 
> Haskell, unfortunately I can't seem to find it now, but this paper ( 
> http://research.microsoft.com/en-us/um/people/simonpj/papers/verify/haskellcontract.ps
>  ) by Simon Peyton Jones among others seems to be about the same thing the 
> site I found was talking about. The idea is to provide enough extra 
> information to the type system to actually be able to verify that for 
> instance, secondElement is always called with at least two items. If there 
> exists in your code any situation in which the contract of a function could 
> be violated (and therefore the possibility of blowing up at runtime), it no 
> longer passes static type checking. The paper doesn't go much into the impact 
> something like that would have on for instance GHCi, but if it was smart 
> enough to inherit contracts from functions used and display these derived 
> contracts this would be a very simple way to find all the edge cases of your 
> code.
> 
> -R. Kyle Murphy
> --
> Curiosity was framed, Ignorance killed the cat.
> 
> 
> On Tue, May 4, 2010 at 12:56, John Lato <jwl...@gmail.com> wrote:
> On Tue, May 4, 2010 at 5:31 PM, Gregory Crosswhite
> <gcr...@phys.washington.edu> wrote:
> >
> > Yes, but I think that it is also important to distinguish between cases 
> > where an error is expected to be able to occur at runtime, and cases where 
> > an error could only occur at runtime *if the programmer screwed up*.  If 
> > you structure your code to preserve and rely on the invariant that a given 
> > list has at least two elements, then it makes sense to call secondElement 
> > because if the list doesn't have two elements then you screwed up.  
> > Furthermore, there is no way to recover from such an error because you 
> > don't necessarily know where the invariant was broken because if you did 
> > you would have expected the possibility and already fixed it.
> >
> > But hypothetically, suppose that you decided to use safeSecondElement 
> > anyway;  now you have to deal with a Nothing in your code.  Since, again, 
> > you don't know how to recover from this (as if you did, you wouldn't have 
> > gotten a Nothing in the first place), the only thing you can do is 
> > propagate it through the calculation, until it reaches someone who can 
> > recover from it, which means that now your whole calculation has to be 
> > muddled up with Maybe types wrapping every result purely to capture the 
> > possibility of a bug (or hardware fault, I suppose).  If your program 
> > relied on this calculation, then it *still* has no choice but to terminate, 
> > and it *still* doesn't know where the error occurred --- although if you 
> > use something like ErrorT, you might at least know what the nature of the 
> > error was.  So basically, you still end up with having to terminate your 
> > program and printing out an error message reporting the existence of a bug, 
> > but now you had to add error-propagating infrastructure to your entire 
> > program to do this that makes every function more complicated, rather than 
> > relying on the built-in infrastructure supplied by Haskell in the form of 
> > undefined, error, and throwing exceptions from pure code.
> >
> > If you want to make your program fault tolerant against bugs --- which is 
> > reasonable in programs such as, say, a text editor, where inability to 
> > complete one task doesn't necessarily mean that the whole program has to 
> > stop --- then you are probably working in the IO monad and so have access 
> > to means of catching exceptions, which means that you might as well use 
> > them.
> >
> > Thus, if you are dealing with invariants which only fail if you, the 
> > programmer, screwed something up, I don't really see the benefit of using 
> > functions like safeSecondElement over secondElement.  Of course, situations 
> > in which you are *expecting* subcomputations to be able to fail at runtime 
> > if, say, the input is ill-formed, are a different matter.
> 
> I agree completely, although I'm not the first to point out that
> catching exceptions thrown from pure code can be tricky because they
> might not appear where you expect them to.  Of course this can also
> indicate your architecture needs help.
> 
> John
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe@haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
> 

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

Reply via email to