
2006/6/22, Sara Kenedy
Hello all,
Now I am trying with the function of polymorphic type: This function returns the Nth element of list with type a. I try it as below.
getNthElem :: Int -> [a] -> Maybe a getNthElemt _ [] = Nothing getNthElem 0 _ = Nothing getNthElem n s | n > length s = Nothing | otherwise = Just ((drop (n-1) (take n s))!!0)
getNthElem 2 ["a","b","c"] Just "b"
However, I do not satisfy with this function because I want to return the Nth element of type a, not (Maybe a). For example, I want this function: getNthElem :: Int -> [a] -> a
But, I do not know how to define the empty element of type a.
getNthElemt _ [] = ???? getNthElem 0 _ = ????
If you have some ideas about this, please give me some clues. Thanks a lot.
hi, precisely, you want to return an "a" only when there is one accordingly to your above code. the only way to handle this without resorting to [] or Nothing to say there is no such value is to use error or default value. infact, ask yourself, what do you want ?
getNthElem 5 ["a","b","c"] or getNthElem 0 ["a","b","c"] or getNthElem (-1) ["a","b","c"] do you want "a" [] Nothing "wrong" or raise an exception (i.e. you use the "error" function) ?
once you know what you want, you can code it. note, i think your 'take" is unnecessary here
| otherwise = Just ((drop (n-1) (take n s))!!0)
also you can use
| otherwise = Just (n!!some_value) -- :)
this is where you see that the function you're trying to write is really close of
(!!)
cheers, mt