Thank you for the detailed reply! Please see below... On Sat, Jul 25, 2020 at 1:47 PM A Mauer-Oats <[email protected]> wrote:
> Problem 1: > > > But note i can't just type (λ (rng) (apply make-character rng)) into the > REPL, > > If you're using Typed Racket, you probably want type signatures in your > lambdas as well. > In this case, you need to specify the type of `rng` (at least): > > ``` > (λ ([rng : (List Integer Integer)]) (apply make-character rng)) > ``` > Thanks this makes sense. > Problem 2: > > ; readline-input:8:40: Type Checker: type mismatch > ; expected: (-> Integer * Character) > ; given: (-> Integer Integer Character) > ; in: make-character > > I'm not sure about this one; it looks like you are currying _apply_... > Don't you just want `(curry make-character)`? > Like: > > ``` > (define blahh ((curry make-character) 10)) > ``` > > Actually, what i want is the behavior of the original blah function but written simpler. So it's something that takes 2 ints and produces a `Character` from the byte stream held by blah. Problem 2b: understanding the complaint. > The type checker is complaining that it wants something that takes in an > arbitrary number of integers (0 or more), but you have given it something > that takes in exactly two integers. Your inputs need to be a superset of > the allowable inputs, not a subset. > > ; readline-input:8:40: Type Checker: type mismatch > ; expected: (-> Integer * Character) > ; given: (-> Integer Integer Character) > ; in: make-character > > Well, ok. Hm. If i guess if i write this function ``` (: apply2 (All (a b) (-> (-> a a b) (List a a) b))) (define (apply2 f arglist) (apply f arglist)) ``` Then i can do what i was trying to do with: ``` (: f (-> (List Integer Integer) Character)) (define f ((curry (inst apply2 Integer Character)) make-character)) ``` Which is definitely not that simple, so i still am left wondering if i can simplify this all by putting the type system to work somehow... I was thinking if the original function "blah" function could bend apply to its will then i should be able to do something similar in a little different way. Nate > > Possibly helpful: > > > the discussion in typed racket reference "1.6 - Other Type Constructors" > left me hanging a little bit on the function types > > If you haven't read the Typed Racket Guide, section 4.2 and maybe 4.3 > should be easier going than the reference. > > https://docs.racket-lang.org/ts-guide/types.html#%28part._.Function_.Types%29 > > This is ok, but there doesn't seem to be any discussion in the guide of the different function types with stars or ellipses that I have found. > On Saturday, July 25, 2020 at 12:52:43 PM UTC-5, Nate Griswold wrote: >> >> Hello. I am stuck on a probably simple type problem and was wondering if >> someone could help: >> >> I'll just give the actual functions im using: >> >> ``` >> (struct Character ([bytes16 : Bytes])) >> (define substr (make-bytes 128)) >> (: make-character (-> Integer Integer Character)) >> (define (make-character s e) >> (Character (subbytes substr (* 2 s) (* 2 e)))) >> ``` >> >> What i want is a function like: >> >> ``` >> (: blah (-> (List Integer Integer) Character)) >> (define blah (λ (rng) (apply make-character rng))) >> ``` >> >> Which works. >> >> But note i can't just type (λ (rng) (apply make-character rng)) into the >> REPL, because i get: >> >> ; readline-input:5:14: Type Checker: Bad arguments to function in `apply': >> ; Domain: Integer Integer >> ; Arguments: Any >> ; in: (apply make-character rng) >> >> I think because i need the explicit (List Integer Integer) annotation to >> unify with (Listof Integer) >> >> Anyway, i wanted to make my code simpler so i was wondering if i could >> curry and partially apply. So i was digging around in the reference and >> tried: >> >> ``` >> (: blah2 (-> (List Integer Integer) Character)) >> (define2 blah2 ((curry (inst apply Integer Character)) make-character) >> ``` >> >> But i get: >> >> ; readline-input:8:40: Type Checker: type mismatch >> ; expected: (-> Integer * Character) >> ; given: (-> Integer Integer Character) >> ; in: make-character >> >> Looking at the typed racket reference and the type of apply, thought the >> star meant i could have many integers. Actually to be honest the discussion >> in typed racket reference "1.6 - Other Type Constructors" left me hanging a >> little bit on the function types, I am a pretty green on working with >> racket types and types in general. I thought this would unify but i guess i >> am completely wrong. Does anyone know what i am doing wrong exactly or what >> a very abbreviated form for what i want (behavior of blah) is? >> >> Sorry if this is basic i am a little lost on it as you can probably tell. >> >> Thank you >> >> Nate >> >> >> -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/083c3f2f-dfbd-4957-8b3d-690cab6d674eo%40googlegroups.com > <https://groups.google.com/d/msgid/racket-users/083c3f2f-dfbd-4957-8b3d-690cab6d674eo%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/CAM-xLPqeFptgx8Yxi636oPsp5MP6sEOj%2BkFJN90_bKvoCpMyYQ%40mail.gmail.com.

