Please take me off the list

Thanks

On Sun, Sep 28, 2014 at 11:00 PM,  <[email protected]> wrote:
> Send users mailing list submissions to
>         [email protected]
>
> To subscribe or unsubscribe via the World Wide Web, visit
>         http://lists.racket-lang.org/users/listinfo
> or, via email, send a message with subject or body 'help' to
>         [email protected]
>
> You can reach the person managing the list at
>         [email protected]
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of users digest..."
>
>
> [Racket Users list:
>  http://lists.racket-lang.org/users ]
>
>
> Today's Topics:
>
>    1. Re: typed racket, filters, and polymorphism (Alexander D. Knauth)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Sun, 28 Sep 2014 23:00:17 -0400
> From: "Alexander D. Knauth" <[email protected]>
> To: racket users list <[email protected]>
> Subject: Re: [racket] typed racket, filters, and polymorphism
> Message-ID: <[email protected]>
> Content-Type: text/plain; charset="utf-8"
>
> I just realized that typed racket seems to ignore the guard anyway, so I 
> could do something like this and convince the type-checker that any value I 
> want has any type that I want:
>
> (struct (a) foo ([a : a])
>   #:guard (lambda (a _) "this value"))
>
> (: x : (foo 1))
> (define x (foo 1))
>
>> (foo-a x)
> - : Integer [more precisely: One]
> "this value?
>
>
> On Sep 28, 2014, at 10:41 PM, Benjamin Greenman <[email protected]> wrote:
>
>> I was able to get something very similar to your example program to compile.
>>
>> (struct (a) foo ([a : a]) #:transparent
>>         #:guard (lambda (a _)
>>                   (define a* a)  ;; a* not "polluted" by occurrence typing
>>                   (unless (exact-integer? a)
>>                     (error 'foo "expected Integer, given ~v" a))
>>                   a*))  ;; we return a value of type a, so the typechecker 
>> is happy
>>
>> From here, you can safely cast a foo-a into an Integer. It's not type safe 
>> to ann because we (deliberately) don't have the occurrence typing 
>> information, but we the programmers can be sure that the casts will never 
>> fail.
>>
>> (cast (foo (ann 1 Any)) (foo Integer))
>> > (foo 1)
>>
>>
>>
>> On Sun, Sep 28, 2014 at 10:29 PM, Matthias Felleisen <[email protected]> 
>> wrote:
>>
>> You might be able to unwrap such things for a local context, but then you 
>> need to wrap it again on the way out. That cost might become quite high if 
>> it happens in a loop. Then again Racket programs rely on this a lot too (as 
>> do many dynamically typed programs) so it might not be a cost that kills 
>> performance completely. But do be aware of how others deal with this issue 
>> -- Matthias
>>
>>
>>
>>
>>
>>
>>
>> On Sep 28, 2014, at 10:03 PM, Alexander D. Knauth wrote:
>>
>>>
>>>
>>> On Sep 28, 2014, at 8:25 PM, Matthias Felleisen <[email protected]> 
>>> wrote:
>>>
>>>>
>>>> Your message points out where gradual typing badly fails.
>>>>
>>>> Type systems combine two nearly orthogonal ideas: (1) proving theorems 
>>>> about your program and (2) bridging the gap between abstract linguistic 
>>>> constructs and concrete machine implementations. In a sense, the design of 
>>>> a type system should always have the goal to eliminate as much run-time 
>>>> overhead as possible.
>>>>
>>>> In this specific case, you have two aspects of dimensionality: dimension 
>>>> per se (I am sure there is a word for it) and the chosen unit to represent 
>>>> it. So if you know that a number denotes a distance, you can choose mm, m, 
>>>> and km to represent it. If you want to represent an area, you choose mm^2, 
>>>> m^2, km^2. Now if you want to compute the area of a rectangle, you write
>>>>
>>>>  area-of-rectangle :  Real [Distance in m] * Real [Distance in m] -> Real 
>>>> [Area in m^2]
>>>>
>>>> If someone writes (area-of-rectangle 1 [mm] 1 [km]), there is nothing 
>>>> wrong with it -- except that the type checker should insert a coercion 
>>>> from mm to m and from km to m (multiplying/dividing by 1,000). That is, a 
>>>> type system for this application ought to use the type elaboration process 
>>>> idea and translate code as it goes.
>>>>
>>>> This is quite comparable to the idea that a machine-oriented type system 
>>>> needs to insert a coercion from integer to real (for example) as Algol 60 
>>>> and its degraded successors do.
>>>
>>> What I had in mind was for the structs to be available at run-time, but 
>>> that ideally the optimizer could take them out for the intermediate 
>>> operations and put them back for the final result.
>>>
>>> And then if this value goes into untyped code, then it knows at run-time 
>>> that it has the unit (u* millimeter kilometer), which is unit=? to 
>>> square-meter.
>>>
>>> Is this sort of like what happens with flonum unboxing?
>>>
>>>
>>>
>>>>
>>>> Our gradual type system lacks some (intensiona) expressive power, which is 
>>>> why you can't get close to this ideal.
>>>>
>>>> -- Matthias
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Sep 28, 2014, at 8:14 PM, Alexander D. Knauth wrote:
>>>>
>>>>> Yes I do want run-time residual of the dimensions, and yes I want a unit 
>>>>> struct.
>>>>>
>>>>> Also if there?s run-time residual, then I can use predicates and 
>>>>> occurrence typing, and it can also be used in untyped code with contracts 
>>>>> instead of types.
>>>>>
>>>>> And also the type-checker would check if it is dimension-correct, but at 
>>>>> run-time it would would still convert between different units of the same 
>>>>> dimension, multiply and divide units, etc.
>>>>>
>>>>> On Sep 28, 2014, at 6:58 PM, Matthias Felleisen <[email protected]> 
>>>>> wrote:
>>>>>
>>>>>>
>>>>>> If you want the type checker to ensure your program is unit-correct, I 
>>>>>> assume you also want no run-time residual of the dimensions but that is 
>>>>>> in conflict with wanting a structure because it imposes a run-time cost. 
>>>>>> Are you sure you want a unit? -- Matthias
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sep 28, 2014, at 1:37 PM, Alexander D. Knauth wrote:
>>>>>>
>>>>>>> No because I want the unit to be a struct that has a dimension field, 
>>>>>>> not a symbol with various dimensions defined as unions of units.
>>>>>>> I want the unit to be based on the dimension, not the other way around, 
>>>>>>> so that new units can be made that have the same dimension.
>>>>>>>
>>>>>>> I have something like the number+unit struct (I called it measure), but 
>>>>>>> I?ll work on more that after I have the unit struct figured out.
>>>>>>>
>>>>>>> On Sep 28, 2014, at 12:13 PM, Spencer florence 
>>>>>>> <[email protected]> wrote:
>>>>>>>
>>>>>>>> would something like this work?
>>>>>>>>
>>>>>>>> #lang typed/racket
>>>>>>>>
>>>>>>>> (struct (U) number+unit ([amount : Real] [unit : U]))
>>>>>>>>
>>>>>>>> (define-type Weight-Unit (U 'kg 'g 'mg '?g))
>>>>>>>> (define-type Weight (number+unit Weight-Unit))
>>>>>>>> (define-predicate weight? Weight)
>>>>>>>>
>>>>>>>> (: make-weight : Real Weight-Unit -> Weight)
>>>>>>>> (define (make-weight n u)
>>>>>>>>   (number+unit n u))
>>>>>>>>
>>>>>>>> (: +/weight : Weight Weight -> Weight)
>>>>>>>> ;; something something needs unit conversion
>>>>>>>> (define (+/weight w1 w2)
>>>>>>>>   (number+unit (+ (number+unit-amount w1)
>>>>>>>>                   (number+unit-amount w1))
>>>>>>>>                (number+unit-unit w1)))
>>>>>>>>
>>>>>>>> (+/weight (make-weight 1 'kg) (make-weight 1 'kg))
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sun, Sep 28, 2014 at 11:03 AM, Alexander D. Knauth 
>>>>>>>> <[email protected]> wrote:
>>>>>>>>
>>>>>>>> Because the struct is representing a unit (kilograms, meters, seconds, 
>>>>>>>> etc.), and a unit has a dimension (mass, length, time, etc.) and I 
>>>>>>>> want the type-checker to be able to know what the dimension of a unit 
>>>>>>>> is so that the types of functions can specify the dimension that 
>>>>>>>> something should have.
>>>>>>>> The real solution to this would probably be bounded polymorphism, but 
>>>>>>>> I was wondering if there was some other way to do it with occurrence 
>>>>>>>> typing in the guard or something like that.
>>>>>>>>
>>>>>>>> On Sep 28, 2014, at 11:48 AM, Sam Tobin-Hochstadt 
>>>>>>>> <[email protected]> wrote:
>>>>>>>>
>>>>>>>> > Why not do this with the type, instead of making this polymorphic?
>>>>>>>> >
>>>>>>>> > Sam
>>>>>>>> >
>>>>>>>> > On Fri, Sep 26, 2014 at 7:35 PM, Alexander D. Knauth
>>>>>>>> > <[email protected]> wrote:
>>>>>>>> >> Is it possible to have a struct that does certain things according 
>>>>>>>> >> to the
>>>>>>>> >> guard?
>>>>>>>> >> #lang typed/racket
>>>>>>>> >>
>>>>>>>> >> (struct (a) foo ([a : a]) #:transparent
>>>>>>>> >> #:guard (lambda (a _)
>>>>>>>> >> (unless (exact-integer? a)
>>>>>>>> >> (error 'foo "expected Integer, given ~v" a))
>>>>>>>> >> a))
>>>>>>>> >>
>>>>>>>> >> (ann (foo (ann 1 Any)) (foo Integer))
>>>>>>>> >>
>>>>>>>> >> (: x : (foo Any))
>>>>>>>> >> (define x (foo 1))
>>>>>>>> >>
>>>>>>>> >> (ann (foo-a x) Integer)
>>>>>>>> >>
>>>>>>>> >> ;. Type Checker: Polymorphic function `foo1' could not be applied to
>>>>>>>> >> arguments:
>>>>>>>> >> ;Argument 1:
>>>>>>>> >> ; Expected: a
>>>>>>>> >> ; Given: Any
>>>>>>>> >> ;
>>>>>>>> >> ;Result type: (foo a)
>>>>>>>> >> ;Expected result: (foo Integer)
>>>>>>>> >> ; in: (foo (ann 1 Any))
>>>>>>>> >> ;. Type Checker: Polymorphic function `foo-a' could not be applied 
>>>>>>>> >> to
>>>>>>>> >> arguments:
>>>>>>>> >> ;Argument 1:
>>>>>>>> >> ; Expected: (foo a)
>>>>>>>> >> ; Given: (foo Any)
>>>>>>>> >> ;
>>>>>>>> >> ;Result type: (a : ....)
>>>>>>>> >> ;Expected result: Integer
>>>>>>>> >> ; in: (foo-a x)
>>>>>>>> >>
>>>>>>>> >> On Sep 25, 2014, at 9:42 PM, Alexander D. Knauth 
>>>>>>>> >> <[email protected]>
>>>>>>>> >> wrote:
>>>>>>>> >>
>>>>>>>> >> What I?m trying to accomplish is something more like this:
>>>>>>>> >> #lang typed/racket
>>>>>>>> >>
>>>>>>>> >> (require "dimensions.rkt")
>>>>>>>> >>
>>>>>>>> >> (struct (d) unit ([name : Any] [scalar : Positive-Real] [dimension 
>>>>>>>> >> : d])
>>>>>>>> >> #:transparent
>>>>>>>> >> #:guard (lambda (name scalar dimension _)
>>>>>>>> >> (unless (dimension? dimension)
>>>>>>>> >> (error 'unit "expected Dimension, given ~v" dimension))
>>>>>>>> >> (values name scalar dimension)))
>>>>>>>> >>
>>>>>>>> >> (define-type (Unitof d) (unit d))
>>>>>>>> >>
>>>>>>>> >> (define-type Unit (Unitof Dimension))
>>>>>>>> >>
>>>>>>>> >> (define Unit? (make-predicate Unit))
>>>>>>>> >>
>>>>>>>> >> (define-type Unitish
>>>>>>>> >> (U (Unitof Any)
>>>>>>>> >> Dimension
>>>>>>>> >> Positive-Real))
>>>>>>>> >>
>>>>>>>> >> (: ->unit : (All (d) (case-> [(Unitof d) -> (Unitof d)]
>>>>>>>> >> [Unitish -> Unit])))
>>>>>>>> >> (define (->unit u)
>>>>>>>> >> (cond [(unit? u)
>>>>>>>> >> (unless (Unit? u) ; this should never happen anyway because of the
>>>>>>>> >> guard
>>>>>>>> >> (error '->unit "expected (Unitof Dimension), given ~v" u))
>>>>>>>> >> u]
>>>>>>>> >> [(dimension? u) (unit u 1 u)]
>>>>>>>> >> [(positive-real? u) (unit u u dimensionless-dimension)]))
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> On Sep 25, 2014, at 6:19 PM, Sam Tobin-Hochstadt 
>>>>>>>> >> <[email protected]>
>>>>>>>> >> wrote:
>>>>>>>> >>
>>>>>>>> >> No, I don't think you can do this. Can you say more about what 
>>>>>>>> >> you're
>>>>>>>> >> trying to accomplish?
>>>>>>>> >>
>>>>>>>> >> Sam
>>>>>>>> >>
>>>>>>>> >> On Thu, Sep 25, 2014 at 6:15 PM, Alexander D. Knauth
>>>>>>>> >> <[email protected]> wrote:
>>>>>>>> >>
>>>>>>>> >> Do any of you have any advice for getting a function like this to
>>>>>>>> >> type-check?
>>>>>>>> >> #lang typed/racket
>>>>>>>> >>
>>>>>>>> >> (: check-int : (All (a) (case-> [a -> a]
>>>>>>>> >> [Any -> Integer])))
>>>>>>>> >> (define (check-int int)
>>>>>>>> >> (unless (exact-integer? int)
>>>>>>>> >> (error 'check-int "expected Integer, given ~v" int))
>>>>>>>> >> int)
>>>>>>>> >>
>>>>>>>> >> ;. Type Checker: type mismatch
>>>>>>>> >> ; expected: a
>>>>>>>> >> ; given: Integer in: int
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> ____________________
>>>>>>>> >> Racket Users list:
>>>>>>>> >> http://lists.racket-lang.org/users
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>> >> ____________________
>>>>>>>> >> Racket Users list:
>>>>>>>> >> http://lists.racket-lang.org/users
>>>>>>>> >>
>>>>>>>> >>
>>>>>>>>
>>>>>>>>
>>>>>>>> ____________________
>>>>>>>> Racket Users list:
>>>>>>>> http://lists.racket-lang.org/users
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> ____________________
>>>>>>>  Racket Users list:
>>>>>>>  http://lists.racket-lang.org/users
>>>>>>
>>>>>
>>>>
>>>
>>
>>
>
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: 
> <http://lists.racket-lang.org/users/archive/attachments/20140928/baf5ed5d/attachment.html>
>
> End of users Digest, Vol 109, Issue 74
> **************************************

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to