hello i'm new to haskell so i'm sorry if this is a stupid question, but i'm having problems with some basic code. the code :
data Maybe Dir = Just Dir | Nothing data Dir = Left | Right | Up | Down data Piece = Vertical | Horizontal | CodeA | CodeB
flow = [(Horizontal, Left, Left), (Horizontal, Right, Right), (Vertical, Down, Down), (Vertical, Up, Up), ................ etc ]
fst :: (a,b,c) -> a fst (x,y,z) = x
scnd :: (a,b,c) -> b scnd (x,y,z) = y
third :: (a,b,c) -> c third (x,y,z) = z
element :: [(Piece, Dir, Dir)] -> Maybe Dir element [] = Nothing element xs = Just (third (head xs))
chgDir :: Piece -> Dir -> Maybe Dir chgDir p d = element (filter (\x -> p == (fst x)) (filter (\x -> d == (scnd x)) flow))
the error i get :
Instances of (Eq Dir, Eq Piece) required for definition of chgDir
Because you're using the function (==) to compare two things of type Piece, Haskell needs to know how to compare them. This information isn't provided by your type definitions.
(==) works on types which are members of the Eq typeclass. You can define this instance manually, or, since your type is nice and simple, you can get Haskell to derive it for you.
data Piece = Vertical | Horizontal | CodeA | CodeB deriving Eq
similarly
data Dir = Left | Right | Up | Down deriving Eq
this should sort that problem out.
Incidentally, you don't need to define 'Maybe Dir'. The Maybe type is built in as 'Maybe a', where 'a' is a parameter which can be any type (such as Dir). Your functions should work unchanged if you take out your definition of 'Maybe Dir'.
_______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell