Need help from a newby

View: New views
4 Messages — Rating Filter:   Alert me  

Need help from a newby

by karle :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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?

Re: Need help from a newby

by ChrisK-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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?

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Re: Need help from a newby

by clconway :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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 <ph_kittichai@...> 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?
> --
> 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@...
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
>
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@...
http://www.haskell.org/mailman/listinfo/haskell-cafe

Parent Message unknown Re: Need help from a newby

by ChrisK-5 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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%3Apartition
> 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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@...
http://www.haskell.org/mailman/listinfo/haskell-cafe