Re: [Haskell-cafe] Empty Input list

Hey Chris, thank you for your help! Your last comment with the (!!)-thing was a very good idea! Now my function looks like this: tmp:: [(Int, Int)] -> Int -> (Int, Int) tmp [] y = (0,0) tmp xs y = xs !! (y-1) If the function returns (0,0) it will blocked by another function. If I want to use the "maybe" return, I get some new trouble that I don't like - so I chose that way :) Thank you again Kevin

On Mon, Mar 12, 2012 at 3:14 PM, Kevin Clees
Now my function looks like this:
tmp:: [(Int, Int)] -> Int -> (Int, Int) tmp [] y = (0,0) tmp xs y = xs !! (y-1)
Just a warning that this will still crash if the list is non-empty by the index exceeds the length. That's because your function is no longer recursive, so you only catch the case where the top-level list is empty. The drop function doesn't crash when dropping too many elements though, so you can do this and get a non-recursive function that's still total: tmp :: [(Int,Int)] -> Int -> (Int, Int) tmp xs y = case drop (y-1) xs of [] -> (0,0) Just (x:_) -> x -- Chris Smith

On Tue, Mar 13, 2012 at 12:24 PM, Chris Smith
On Mon, Mar 12, 2012 at 3:14 PM, Kevin Clees
wrote: Now my function looks like this:
tmp:: [(Int, Int)] -> Int -> (Int, Int) tmp [] y = (0,0) tmp xs y = xs !! (y-1)
Just a warning that this will still crash if the list is non-empty by the index exceeds the length. That's because your function is no longer recursive, so you only catch the case where the top-level list is empty. The drop function doesn't crash when dropping too many elements though, so you can do this and get a non-recursive function that's still total:
tmp :: [(Int,Int)] -> Int -> (Int, Int) tmp xs y = case drop (y-1) xs of [] -> (0,0) Just (x:_) -> x
That last line should be (x:_) -> x without the "Just". Hopefully that'll save a bit of confusion. Chris
-- Chris Smith
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe

Look also at safe package http://hackage.haskell.org/package/safe
2012/3/13 Chris Wong
On Tue, Mar 13, 2012 at 12:24 PM, Chris Smith
wrote: On Mon, Mar 12, 2012 at 3:14 PM, Kevin Clees
wrote: Now my function looks like this:
tmp:: [(Int, Int)] -> Int -> (Int, Int) tmp [] y = (0,0) tmp xs y = xs !! (y-1)
Just a warning that this will still crash if the list is non-empty by the index exceeds the length. That's because your function is no longer recursive, so you only catch the case where the top-level list is empty. The drop function doesn't crash when dropping too many elements though, so you can do this and get a non-recursive function that's still total:
tmp :: [(Int,Int)] -> Int -> (Int, Int) tmp xs y = case drop (y-1) xs of [] -> (0,0) Just (x:_) -> x
That last line should be
(x:_) -> x
without the "Just". Hopefully that'll save a bit of confusion.
Chris
-- Chris Smith
_______________________________________________ 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

Kevin Clees
Now my function looks like this:
tmp:: [(Int, Int)] -> Int -> (Int, Int) tmp [] y = (0,0) ^^^^^ tmp xs y = xs !! (y-1)
If the function returns (0,0) it will blocked by another function.
Personally, I think using "special" values like this is a code smell, and indicates poor design. There are many implicit assumptions, for instance that (0,0) isn't already a member of the input list, and that this is correctly handled by surrounding functions. Generally, it's much more desirable to encode this in the types, so I would vastly prefer the Maybe solution in almost all cases, which makes these assumptions explicit. -k -- If I haven't seen further, it is by standing in the footprints of giants
participants (5)
-
Chris Smith
-
Chris Wong
-
Dmitry Olshansky
-
Ketil Malde
-
Kevin Clees