has_two :: dif a b => (a, b)
has_two x y = (x, y)

Keean.
On 13 Jun 2015 12:14 pm, "Matt Oliveri" <atma...@gmail.com> wrote:

> This thread is to discuss the use of type classes to simulate
> predicates. It picks up a loose end from the "LR vs Static Typing"
> thread, but it's really more like a successor of the "Refinement
> types" thread.
>
> I'm still in the middle of a disagreement with Keean about whether
> type classes are an adequate substitute for refinement types. To me
> the answer seems to be no, without a ludicrous extension to the
> instance resolution rules. But Keean still seems to believe the answer
> is yes.
>
> I think the key question is whether type classes, used as predicates,
> are expressive enough to be the predicates that act as type
> refinements.
>
> On Fri, Jun 12, 2015 at 9:09 AM, Matt Oliveri <atma...@gmail.com> wrote:
> > On Fri, Jun 12, 2015 at 7:30 AM, Keean Schupke <ke...@fry-it.com> wrote:
> >> On 12 Jun 2015 12:12, "Matt Oliveri" <atma...@gmail.com> wrote:
> >>> Remember we talked quite a bit about how you want
> >>> to use a stack of logic programming languages where each implements
> >>> the type system of the layer below. Or something like that. (And this
> >>> isn't type universes! You must not forget! ;) ) (The bottom layer
> >>> would be something like Haskell, I assume. But at any rate it would
> >>> not be another logic language.)
>
> >>> So I have a rough idea of what you're
> >>> doing, I think, but practically do idea why you're doing it. Why the
> >>> fascination with type classes instead of real predicates?
> >>
> >> I am not sure there is a difference?
> >
> > But are you sure there's _not_ a difference? :)
> > So what type classes seem useful for is:
> > 1) Reasoning about the syntactic representations of types, by
> > imitating logic programming.
> >
> > 2) Asking for certain structure (the type class methods) on types.
>
> I assume (2) is the main/intended use case of type classes, but Keean
> seems to be basing his refinements on the ability to do (1). (Though
> it's technically irrelevant, this already makes it seem like a hack to
> me.)
>
> > (1) doesn't consider the meaning of types. That is, what elements they
> > have. (2) does, but it seems unable to say much about those elements.
> >
> > Here's an example of a predicate on a type which is satisfied by all
> > types with at least two elements:
> >
> > Definition HasTwo T := exists x y:T,x <> y.
> >
> > ("exists" is the existential quantifier. "<>" is "not equal to".)
> >
> > I don't see how you'd express this as a type class, since it isn't
> > covered by (1) or (2).
> >
> > Note that the "not equal" bit is not optional, because having "two"
> > elements which are the same doesn't count. For example,
> >
> > class HasTwoSorta T where
> > x :: T
> > y :: T
> >
> > is wrong. We can produce an instance for unit, which has only one
> > element, by taking both x and y to be ().
>
> Although I'm still curious whether HasTwo can be defined as a type
> class, it isn't technically necessary in order to do refinement types,
> since the predicates for refinement types are predicates on values.
> Keean is encoding values as types (another hack?), because type
> classes are only predicates on types. But this only means that type
> classes need to be expressive-enough predicates on encoded values.
>
> > my
> > impression is that the semantics of logic programming is still
> > basically restricted to predicates on syntax trees.
> >
> > It could be worse. ACL2's semantics are about equally restricted. But
> > for verifying big programs, you're going to miss the other goodies
> > that can be found in "mathematics-grade" logics. For example, real
> > predicates on types are nice.
>
> I should probably start by finding out if Keean's approach can really
> match ACL2. The nicest thing ACL2 doesn't have is probably first-class
> functions.
>
> > And [predicates on types] are a prerequisite for flexible
> > refinement typing.
>
> That was wrong. I had confused myself. That's probably how I chose
> HasTwo in the first place. But type predicates would still probably
> come in handy.
> _______________________________________________
> bitc-dev mailing list
> bitc-dev@coyotos.org
> http://www.coyotos.org/mailman/listinfo/bitc-dev
>
_______________________________________________
bitc-dev mailing list
bitc-dev@coyotos.org
http://www.coyotos.org/mailman/listinfo/bitc-dev

Reply via email to