Thank you for the feedback! I think this macro is a very nice idea and should indeed allow removing most compose-i functions, except maybe for compose-3 and compose-4, which can be examples of use of make-compose.
I added a Contributing section to the README of the Git repo: https://git.marvid.fr/scolobb/typed-compose#contributing . Do you think you can make the modifications directly a git clone of my repository and submit the changes to me as patches? - Sergiu On Sunday, January 10, 2021 at 6:00:58 AM UTC+1 [email protected] wrote: > Nice package. I don't have an account and don't know how to do pull > request on Marvid thing, but I suggest making a macro generating > `compose-n` for arbitrary (statically known) n, and export it along side > with the predefined compose-n functions, something along these lines: > > #lang typed/racket/base > > (provide make-compose > compose-3 compose-4) > > (require (for-syntax racket/base > racket/match > racket/list > racket/syntax > syntax/parse)) > > (define-for-syntax (make-compose-type n) > (with-syntax* ([(t ...) (generate-temporaries (make-list n 't))] > [a (generate-temporary 'a)] > [(_ ... t₀) #'(a t ...)] > [(F ...) > (let step ([u #'a] [ts (syntax->list #'(t ...))]) > (match ts > ['() '()] > [(cons t ts*) (cons #`(#,t → #,u) (step t ts*))]))]) > #'(∀ (a t ...) (F ... → t₀ → a)))) > > (define-syntax make-compose > (syntax-parser > [(_ n:nat) > (with-syntax* ([(f ...) (generate-temporaries (make-list (syntax-e > #'n) 'f))] > [x (generate-temporary 'x)] > [T (make-compose-type (syntax-e #'n))] > [body (foldr (λ (fᵢ res) #`(#,fᵢ #,res)) #'x > (syntax->list #'(f ...)))]) > #'(ann (λ (f ...) (λ (x) body)) T))])) > > (define compose-3 (make-compose 3)) > (define compose-4 (make-compose 4)) > ;; and so on > > > > On Monday, January 4, 2021 at 12:52:11 PM UTC-8 unlimitedscolobb wrote: > >> Hello, >> >> I am glad to announce typed-compose, a small package defining some >> utilities for composing functions in Typed Racket: >> >> https://pkgd.racket-lang.org/pkgn/package/typed-compose >> >> Typed Racket's compose only takes two arguments, because in general it >> is difficult to specify that the return types and the argument types should >> be the same for two successive functions in the argument list. This package >> defines some further utilities to allow compose-ing more than two >> functions more comfortable in Typed Racket. >> >> This is my first ever Racket package, so I'm taking all kinds of feedback. >> >> - >> Sergiu >> > -- 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/25e19ab5-54ea-40b2-a1c0-621982b520a9n%40googlegroups.com.

