[Haskell-cafe] Re: Is "take" behaving correctly?
ChrisK
haskell at list.mightyreason.com
Wed Sep 12 06:44:20 EDT 2007
Conor McBride wrote:
> Hi folks
>
> On 12 Sep 2007, at 00:38, Brent Yorgey wrote:
>
>>
>> On 9/11/07, PR Stanley <prstanley at ntlworld.com> wrote: Hi
>> take 1000 [1..3] still yields [1,2,3]
>> I thought it was supposed to return an error.
>
> [..]
>
>> If for some reason you want a version that does return an error in
>> that situation, you could do something like the following:
>>
>> take' n _ | (n <= 0) = []
>> take' n [] | (n > 0) = error "take': list too short"
>> | otherwise = []
>> take' n (x:xs) = x : take' (n-1) xs
>>
>> I'm not sure why you'd want that, though. The standard implementation
>> gracefully handles all inputs, and usually turns out to be what you want.
>
> There are two sides to this form of "grace", though. I'll grant you, it's
> quite hard to pull off a successful fraud without a degree of aplomb.
>
> I always hope that key invariants and hygiene conditions can be built into
> the static semantics of programs, but where that's impractical somehow, I
> prefer if the dynamic behaviour makes it as easy as possible to assign the
> blame for errors. In such circumstances, I'd like operations to complain
> about bogus input, rather than producing bogus output.
>
Then you want a runtime assertion checking error helpful Data.List replacement.
Could you use Control.Exception.assert and make a wrapper for Data.List?
http://www.haskell.org/ghc/docs/latest/html/users_guide/sec-assertions.html
More information about the Haskell-Cafe
mailing list