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 <sa...@cs.indiana.edu> 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
> <alexan...@knauth.org> 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

Reply via email to