[Haskell-beginners] Concrete instance of abstract class
Adrian May
adrian.alexander.may at gmail.com
Wed Jun 5 18:08:46 CEST 2013
Hi folks,
I just wrote this:
import Diagrams.Prelude
import Diagrams.Backend.Cairo
type Dia = Diagram Cairo R2
class Turtlish t where
pic :: t s -> Dia
state :: t s -> s
move :: s -> t s -> t s
(>>>),(+++) :: t s -> t s -> t s
x >>> y = x +++ move (state x) y
The idea is that s is a turtle state, t s contains such a state along with
a growing diagram, and >>> superimposes the diagrams after shuffling the
right hand t s around according to the s I extract from the left hand t s.
But I have different turtles planned. I want a regular turtle, a Sankey
turtle which also has a width, and we could imagine sub-turtles that only
had the angle or only the position. But in all cases, I think the above
class describes how I want to compose diagrams together. I already tried it
with monads but I'm now thinking that I want something like the above *
instead* of a monad.
So how do I use it to make a regular turtle? Maybe something like:
data TurtState = TurtState P2 CircleFrac
data TurtWorld s = TurtWorld Dia s
I know exactly what s is above but otherwise the kinds don't match below.
instance Turtlish TurtWorld where
pic (TurtWorld d _) = d
state (TurtWorld _ s) = s
(TurtWorld d1 _) +++ (TurtWorld d2 s2) =
TurtWorld (d1 `atop` d2) s2
move (pp,aa) (TurtWorld d (p,a)) = TurtWorld
(d # rotate aa # translate pp)
( (p # rotate aa + pp) , (a+aa) )
Naturally, it barfs over move saying:
Couldn't match type `s' with `(R2, t0)'
`s' is a rigid type variable bound by
the type signature for move :: s -> TurtWorld s -> TurtWorld s
at turtle.hs:20:3
In the pattern: (pp, aa)
In an equation for `move':
move (pp, aa) (TurtWorld d (p, a))
= TurtWorld
(d # rotate aa # translate pp) ((p # rotate aa + pp), (a +
aa))
In the instance declaration for `Turtlish TurtWorld'
because it hasn't a clue what (pp,aa) is and wants s totally generic
anyway.
But what am I supposed to do instead? Isn't it an everyday thing to use a
generic pattern with a specific type?
TIA,
Adrian.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130606/a408d072/attachment.htm>
More information about the Beginners
mailing list