
My declaration is as followed:- type Address = Int data Port = C | D deriving(Eq,Show) data Payload = UP[Char] | RTDP(Address,Port) deriving(Eq,Show) data Pkgtype = RTD | U deriving(Eq,Show) type Pkg = (Pkgtype,Address,Payload) type Table = [(Address,Port)] findport::[Pkg]->[Table]->[([Pkg],[Pkg])] findport [(pt,ad,pa)] [(a,p)] | ( p == C) = ([pt,ad,a],[]) | otherwise = ([],[pt,ad,a]) Error received:- Type error in explicitly typed binding *** Term : [(a,p)] *** Type : [(a,b)] *** Does not match : [Table] Can anyone please help? -- View this message in context: http://www.nabble.com/Need-help-from-a-newby-tf4735009.html#a13540531 Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.

karle wrote:
My declaration is as followed:-
type Address = Int data Port = C | D deriving(Eq,Show) data Payload = UP[Char] | RTDP(Address,Port) deriving(Eq,Show) data Pkgtype = RTD | U deriving(Eq,Show) type Pkg = (Pkgtype,Address,Payload) type Table = [(Address,Port)]
findport::[Pkg]->[Table]->[([Pkg],[Pkg])] findport [(pt,ad,pa)] [(a,p)] | ( p == C) = ([pt,ad,a],[]) | otherwise = ([],[pt,ad,a])
Error received:-
Type error in explicitly typed binding *** Term : [(a,p)] *** Type : [(a,b)] *** Does not match : [Table]
Can anyone please help?
There seems to be several things that look wrong. Could you explain what findport is supposed to be doing?

ChrisK-3 wrote:
karle wrote:
My declaration is as followed:-
type Address = Int data Port = C | D deriving(Eq,Show) data Payload = UP[Char] | RTDP(Address,Port) deriving(Eq,Show) data Pkgtype = RTD | U deriving(Eq,Show) type Pkg = (Pkgtype,Address,Payload) type Table = [(Address,Port)]
findport::[Pkg]->[Table]->[([Pkg],[Pkg])] findport [(pt,ad,pa)] [(a,p)] | ( p == C) = ([pt,ad,a],[]) | otherwise = ([],[pt,ad,a])
Error received:-
Type error in explicitly typed binding *** Term : [(a,p)] *** Type : [(a,b)] *** Does not match : [Table]
Can anyone please help?
There seems to be several things that look wrong.
Could you explain what findport is supposed to be doing?
findport is just to check if the port in the Table is equal to C then it will place the packet in the first of the list. Otherwise it will place the packet in the second of the list.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
-- View this message in context: http://www.nabble.com/Need-help-from-a-newby-tf4735009.html#a13541442 Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.

karle wrote:
ChrisK-3 wrote:
karle wrote:
My declaration is as followed:-
type Address = Int data Port = C | D deriving(Eq,Show) data Payload = UP[Char] | RTDP(Address,Port) deriving(Eq,Show) data Pkgtype = RTD | U deriving(Eq,Show) type Pkg = (Pkgtype,Address,Payload) type Table = [(Address,Port)]
findport::[Pkg]->[Table]->[([Pkg],[Pkg])] findport [(pt,ad,pa)] [(a,p)] | ( p == C) = ([pt,ad,a],[]) | otherwise = ([],[pt,ad,a])
Error received:-
Type error in explicitly typed binding *** Term : [(a,p)] *** Type : [(a,b)] *** Does not match : [Table]
Can anyone please help? There seems to be several things that look wrong.
Could you explain what findport is supposed to be doing?
findport is just to check if the port in the Table is equal to C then it will place the packet in the first of the list. Otherwise it will place the packet in the second of the list.
So for each Pkg in [Pkg] the findport function takes the Address element in the Pkg and looks it up in the Table. If the Address is C or D the original pkg gets places in the first or second output list. The 'partition' function from Data.List could help here: http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-List.html#v%...
partition :: (a -> Bool) -> [a] -> ([a], [a])
The partition function takes a predicate a list and returns the pair of lists of elements which do and do not satisfy the predicate, ...
But your findport function is fairly broken right now. The output (pt,ad,a) should be (pt,ad,pa). This was likely a typographical error and is caught by the type system. The declared type of the second argument should be Table, not [Table]. This is the simple error that the compiler is reporting. The first argument is matched against the pattern [(pt,ad,pa)] which only matched lists with a single Pkg. This is also true of the second argument getting pattern matched against [(a,p)] since this only matches Tables with a single entry. These are errors in how findport has been written, I'll give you a chance to try fixing each of these. You will need to handle lists with any number of elements (including empty lists). You also do not say what should happen to a Pkg with an Address that is not in the Table. Cheers, Chris

Substitute the definition of type Table into the error:
Type error in explicitly typed binding
*** Term : [(a,p)]
*** Type : [(a,b)]
*** Does not match : [Table]
where [Table] = [[(Address,Port)]]
Do you see why the expression [ (a,p) ] cannot have type [ [
(Address, Port) ] ] ?
Regards,
Chris
On 11/1/07, karle
My declaration is as followed:-
type Address = Int data Port = C | D deriving(Eq,Show) data Payload = UP[Char] | RTDP(Address,Port) deriving(Eq,Show) data Pkgtype = RTD | U deriving(Eq,Show) type Pkg = (Pkgtype,Address,Payload) type Table = [(Address,Port)]
findport::[Pkg]->[Table]->[([Pkg],[Pkg])] findport [(pt,ad,pa)] [(a,p)] | ( p == C) = ([pt,ad,a],[]) | otherwise = ([],[pt,ad,a])
Error received:-
Type error in explicitly typed binding *** Term : [(a,p)] *** Type : [(a,b)] *** Does not match : [Table]
Can anyone please help? -- View this message in context: http://www.nabble.com/Need-help-from-a-newby-tf4735009.html#a13540531 Sent from the Haskell - Haskell-Cafe mailing list archive at Nabble.com.
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (3)
-
ChrisK
-
Christopher L Conway
-
karle