[Haskell-cafe] Sub class and model expansion
Ryan Ingram
ryani.spam at gmail.com
Tue May 31 19:05:36 CEST 2011
On Tue, May 31, 2011 at 1:40 AM, Patrick Browne <patrick.browne at dit.ie>wrote:
> Continuing the thread on model expansion.
> I have changed the example trying to focus on expanding models of M in G
> Why is the operation ! ok or RHS but not visible on LHS of G?
> The equation itself does not seem to suffer from the dependent type
> problem of my previous post.
>
> class M a where
> (!) :: a -> a -> a
> e :: a
>
>
> class M a => G a where
> (!-) :: a -> a -> a
> -- OK in G
> a !- e = e ! a
>
This doesn't do what you think. This is equivalent to
(!-) = (\a e -> e ! a)
That is, "e" is lambda-bound here, not the same "e" from M. In this case
you've defined (!-) as "flip (!)"
When you define functions in a class declaration, you are just defining a
default implementation. Generally this is used when you can implement some
functions in terms of the others, such as:
class Eq a where
(==) :: a -> a -> a
(/=) :: a -> a -> a
a == b = not (a /= b)
a /= b = not (a == b)
Now someone making an instance of this class need only define (==) or (/=);
the other one will be defined via the default instance. (This has the
somewhat undesirable property that 'instance Eq X where' with no methods is
a valid instance declaration but in that instance == and /= are infinite
loops)
Maybe this will help you think about this: what code do you expect to write
for instances of this class?
instance M Int where
e = 0
(!) = +
instance G Int where
-- do I need to write any code here?
It seems to me you are expecting the compiler to automatically derive the
definition 'inverse = negate'; there's no general way for the compiler to do
so, since it doesn't know the structure of your type.
Functions in Haskell, unlike, say, Prolog, only go from left of the = to the
right of the =. Thanks to referential transparency, you can go backwards
from the point of view of proving properties about your code, but during
evaluation term rewriting only happens from left to right.
-- ryan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20110531/77bc7987/attachment.htm>
More information about the Haskell-Cafe
mailing list