
On 2008 Aug 2, at 22:09, Alex Watt wrote:
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:
Not with pattern matching by itself; using a name in a pattern creates a new binding. You can use guards:
same :: a -> a -> Bool same x y | x == y = True same _ _ = False
which simplifies to
same :: a -> a -> Bool same x y = x == y
foo [x,x,x] = ...
import Data.List foo :: [a] -> Bool foo x@(y:_:_:[]) = filter (== y) x
This becomes unwieldy for large lists; you would instead switch to a guard:
import Data.List foo :: [a] -> Bool foo x@(y:x') | length x == N = filter (== y) x' -- N is your expected list length foo _ = False
or, possibly saving a few microseconds
import Data.List foo :: [a] -> Bool foo (y:x) | length x == N = filter (== y) x -- n is one less than your list length foo _ = False
-- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH