On 6 Jun 2015 21:44, "Matt Oliveri" <[email protected]> wrote:
>
> On Sat, Jun 6, 2015 at 11:04 AM, Keean Schupke <[email protected]> wrote:
> > On 6 Jun 2015 11:46, "Matt Oliveri" <[email protected]> wrote:
> >> What you still haven't told me is whether "a" from your examples is
> >> itself a type. If so, what are its elements? If not, how can you apply
> >> a type class to it? Without this information, you cannot expect me to
> >> make much sense of this. Maybe it'd help if you actually showed me the
> >> definition of Triangle.
> >
> > class Point2D container unit where
> >     x_coord :: container -> unit
> >     y_coord :: container -> unit
> >
> > instance Point2D (Vector Float) Float where
> >     x_coord c = c[0]
> >     y_coord c = c[1]
> >
> > class Triangle container point where
> >     point1 :: container -> point
> >     point2 :: container -> point
> >     point3 :: container -> point
> >
> > instance Triangle Point2D  where
> >     point1 p = p[0]
> >     point2 p = p[1]
> >     point3 p = p[2]
> >
> > We don't care what the generic container is used to hold the points,
nor do
> > we care about how many dimensions the points have.
>
> Lovely, Keean. But since this is just an example for discussing
> refinements vs. type classes, it might be simpler to stick with lists,
> for the polygons, and pairs of floats, for 2D points.

I am showing that 'triangleness' can be seen as a constraint on the type.

> More importantly, now I understand why members of Triangle are types
> whose elements represent triangles. (And not themselves triangles.)
>
> > class RightTriangle container unit where ...
> >
> > So RightTriangle is a predicate that is true if the type is a right
> > triangle.
>
> So how would you code that? See this is the part I don't know how to
> do with Haskell type classes.

Actually the mechanics of this require a lot of tedious boiler plate in
Haskell. But we can do it with polymorphic recursion.

> Actually, no. I do know a way to do it. But it seems awkward,
> especially if you don't limit points to be 2D. You work around the
> absence of actual predicates by presenting the data of a right
> triangle so that it's right by construction. Like if points were 2D,
> you could have a corner (point), base and height (scalar), flipped
> (boolean), and rotation angle.
>
> What I don't know how to do is simply state that one of the angles is
> right. (Like, by saying that the dot product of two of the sides
> (considered as vectors) is zero.)
>
> > So the point is functions like scale:
> >
> > scale :: Polygon a unit => unit -> a -> a
> >
> > a is a type constrained by the type-classes, that's all we ever need to
know
> > about it.
>
> OK. Now how would you state that scale preserves rightness of triangles?

This makes me want to use a type for RightTriangle, but then how would I
write 'shere' where a RightTriangle may not be afterward, or a non right
triangle may become a right one?

How would you write a single scale function for all polygons that preserves
a rightness property?

Keean.
_______________________________________________
bitc-dev mailing list
[email protected]
http://www.coyotos.org/mailman/listinfo/bitc-dev

Reply via email to