
Hey Alex, On 3 aug 2008, at 04:09, Alex Watt wrote:
Hi there,
The best way I can explain what I'd like to do is show an example, so here goes:
same :: a -> a -> Bool same x x = True same _ _ = False
Is there any way to do this in Haskell? The actual reason I'd like to do this is something slightly more complicated. I want to match against a list of elements, like so:
foo [x,x,x] = ...
If you want to check whether all elements of the list are the same, you'd need a function of type [a] -> Bool. There is no such function in the standard libraries (search for this type using Hoogle [1]). Fortunately, Hoogle will point us to all, which only needs a function from (a -> Bool) that is checked on every member of the list. One way we could solve this problem is to see whether all elements are equal to the first element. This is trivially expressed: allEqual :: Eq a => [a] -> Bool allEqual xs = all (== head xs) xs This also works for the empty list: because of lazy evaluation the expression "head xs" is only computed when actually needed. -chris [1]: http://www.haskell.org/hoogle/?q=[a]+-%3E+Bool