[Haskell-cafe] no dynamic binding

Georg Martius mai99dgf at studserv.uni-leipzig.de
Sun Sep 19 14:54:57 EDT 2004


Hi,

it might be better to use a simple abstact data type for it like:

-- | Command Type has for all possible actions a contructor
data Command = INIT String String Bool -- ^ Teamname, Version, Goalkeeper or not
	     | RECONNECT String Integer -- ^ Teamname, Playernum (Unum)
	     | CATCH Angle
	     | CHANGEVIEW ViewWidth ViewQuality
	     | DASH Integer -- ^ Power [-100, 100]
	     | KICK Integer Angle -- ^ Power [-100,100], direction
	     | MOVE Double Double -- ^ X, Y Coordinate
	     | SAY String
	     | REQUESTSENSEBODY
	     | REQUESTSCORE
	     | TURN Angle   -- ^ Angle [-180, 180] see 'Direction'
	     | TURNNECK Angle -- ^ Angle [-90,90]
	     | BYE
	     | NOACTION  -- ^ this means we do nothing

--  Show instance for Command to create syntactical correct command strings
instance Show Command where
     show NOACTION = ""
     show c = "(" ++ (concat strlist) ++ ")"
	where strlist =
		  case c of
		      INIT team ver True -> ["init ", team, " (version ", ver, ") goalie"]
		      INIT team ver False -> ["init ", team, " (version ", ver, ")"]
		      RECONNECT team unum -> ["reconnect ", team, " ", show unum]
		      CATCH dir  -> ["catch ", show dir]
		      CHANGEVIEW width quali -> ["change_view ", show width, show quali]
		      DASH p     -> ["dash ", show p]
		      KICK p dir -> ["kick ", show p, " ", show dir]
		      MOVE x y   -> ["move ", show x, " ", show y]
		      SAY msg    -> ["say ", msg]
		      REQUESTSENSEBODY -> ["sense_body"]
		      REQUESTSCORE     -> ["score"]
		      TURN a           -> ["turn ", show a]
		      TURNNECK a       -> ["turn_neck ", show a]
		      BYE              -> ["bye"]
		      NOACTION         -> [""]  -- just for compiler

you can just have a [Command] and use show to get the string representation.

As you might guess I have implemented a socker client in haskell allready. I can mail you the code if you want. It is still in the alpha stage, but it can do quite a lot.

Best Regards!
  Georg

On Sun, 19 Sep 2004 13:48:53 -0400, Andrew Harris <andrew.unit at gmail.com> wrote:

> Hi -
>
>    I have another question.  I am still working on a soccer server and
> thought it would be neat to create command objects that had a
> "toString" method.  Then, I was going to keep a list of these command
> objects and at the right time stringify them and send them to the
> server.  So I created a class with a toString method:
>
> class ServerCommandClass a where
>       toString :: a -> String
>
> And then a few instances:
>
> -- dash command
> data DashCommand =
>      DashCommand { dashpower :: Double }
>
> instance ServerCommandClass DashCommand where
>          toString c = "(dash " ++ show (dashpower c) ++ ")\n"
>
> -- move command
> data MoveCommand =
>      MoveCommand { x :: Double,
>                    y :: Double }
>
> instance ServerCommandClass MoveCommand where
>          toString c = "(move " ++ show (x c) ++ " " ++ show (y c) ++ ")\n"
>
>    The problem is, I am not quite sure how to describe a *list* of
> command objects where the list could have both DashCommands and
> MoveCommands in it.  Ideally the list could contain both, and then for
> each item in the list I could call the toString method.
>
>    I was reading Simon Thompson's Haskell: The Craft of Functional
> Programming  and I read that Haskell 98 does not support dynamic
> binding, which (it seems) is what I'm trying to do.  Does anyone have
> a suggestion on an alternative approach?
>
> thanks,
> -andrew
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



-- 

---- Georg Martius,  Tel: (034297) 89434 ----
------- http://www.flexman.homeip.net ---------


More information about the Haskell-Cafe mailing list