[Haskell-beginners] Concrete instance of abstract class
Adrian May
adrian.alexander.may at gmail.com
Thu Jun 6 08:01:34 CEST 2013
Yippee! I fixed something myself for a change...
class Turtlish t where
type Context t :: *
type Content t :: *
construct :: Content t -> Context t -> t
destruct :: t -> (Content t, Context t)
* combine :: t -> t -> Content t*
* contemp :: t -> t -> Context t*
conform :: Context t -> t -> t
present :: t -> Dia
content :: t -> Content t
content = fst.destruct
context :: t -> Context t
context = snd.destruct
(>>>),(+++) :: t -> t -> t
* x +++ y = construct (x `combine` y) (x `contemp` y)*
x >>> y = x +++ conform (context x) y
Seems like it doesn't like seeing *only* associated types in a signature.
Adrian.
On 6 June 2013 13:40, Adrian May <adrian.alexander.may at gmail.com> wrote:
> I'm starting to tidy it up:
>
> class Turtlish t where
> type Context t :: *
> type Content t :: *
> construct :: Content t -> Context t -> t
> destruct :: t -> (Content t, Context t)
> combine :: Content t -> Content t -> Content t
> contemp :: Context t -> Context t -> Context t
> conform :: Context t -> t -> t
> present :: t -> Dia
> content :: t -> Content t
> content = fst.destruct
> context :: t -> Context t
> context = snd.destruct
> (>>>),(+++) :: t -> t -> t
> x +++ y = construct (content x `combine` content y) (context x
> `contemp` context y)
> x >>> y = x +++ conform (context x) y
>
> but I hit this:
>
>
> turtle.hs:23:32:
> Could not deduce (Content t ~ Content t0)
> from the context (Turtlish t)
> bound by the class declaration for `Turtlish'
> at turtle.hs:(9,1)-(24,47)
> NB: `Content' is a type function, and may not be injective
> In the return type of a call of `content'
> In the first argument of `combine', namely `content x'
> In the first argument of `construct', namely
> `(content x `combine` content y)'
>
> turtle.hs:23:64:
> Could not deduce (Context t ~ Context t1)
> from the context (Turtlish t)
> bound by the class declaration for `Turtlish'
> at turtle.hs:(9,1)-(24,47)
> NB: `Context' is a type function, and may not be injective
> In the return type of a call of `context'
> In the first argument of `contemp', namely `context x'
> In the second argument of `construct', namely
> `(context x `contemp` context y)'
>
> What does this mean, and how do I fix it?
>
> TIA,
> Adrian.
>
>
>
>
>
>
> On 6 June 2013 11:28, Adrian May <adrian.alexander.may at gmail.com> wrote:
>
>>
>> Hi Brent,
>>
>>
>>> I would do this using an associated
>>> type, like so:
>>>
>>> class Turtlish t where
>>> type TState t :: *
>>> pic :: t -> Dia
>>> state :: t -> TState t
>>> move :: TState t -> t -> t
>>> (>>>),(+++) :: t -> t -> t
>>> x >>> y = x +++ move (state x) y
>>>
>>>
>> Bingo. Just what I needed. But is this a Haskellish thing to do or am I
>> showing my C++ background by even wanting something like this? Anyway,
>> for the sake of any future googlers, I needed {-# LANGUAGE TypeFamilies
>> #-} and completed the instance with:
>>
>> instance Turtlish TurtWorld where
>> type TState TurtWorld = TurtState
>> ...
>>
>> Thanks,
>> Adrian.
>>
>>
>>
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130606/18ee10ec/attachment.htm>
More information about the Beginners
mailing list