There's an issue open about partition:
 https://github.com/racket/typed-racket/issues/138

Does `my-partition` work like you'd want? Based on Alex's last comment
on the issue, it seems hard to give a predicate that matches the type.


(Whenever I've wanted `partition` in typed code, I was always able to
use 2 filters instead.)

On 10/5/21, 'John Clements' via Racket Users
<[email protected]> wrote:
> I was somewhat surprised to see today that I can’t use a predicate with both
> positive and negative propositions in the way I would expect with
> partition:
>
>> (:print-type partition)
> (All (a b)
>   (case->
>    (-> (-> b Any : #:+ a) (Listof b) (values (Listof a) (Listof b)))
>    (-> (-> a Any) (Listof a) (values (Listof a) (Listof a)))))
>
>
> Specifically, I would have expected the type to be something like this:
>
> (All (a b c)
>   (case->
>    (-> (-> b Any : #:+ a) (Listof b) (values (Listof a) (Listof b)))
>    ;; the second list must consist of 'c's:
>    (-> (-> b Any : #:+ a #:- c) (Listof b) (values (Listof a) (Listof c)))
>    (-> (-> a Any) (Listof a) (values (Listof a) (Listof a)))))
>
> … so that if, say, I had a list of Elephants and Emus, that I could use
> elephant? to split it into two lists: one of type (Listof Elephant) and one
> of type (Listof Emu).
>
> I tried to roll my own, and got pretty close:
>
> (: my-partition
>    (All (a b c)
>         (case->
>          ;; the second list must consist of 'c's:
>          (-> (-> b Any : #:+ a #:- c) (Listof b) (values (Listof a) (Listof
> c)))
>          )))
>
> (define (my-partition my-pred elts)
>   (cond [(empty? elts)
>          (values '() '())]
>         [else
>          (define-values (stacks non-stacks)
>            (my-partition my-pred (rest elts)))
>          (define f (first elts))
>          (cond [(my-pred f)
>                 (values (cons f stacks)
>                         non-stacks)]
>                [else
>                 (values stacks (cons f non-stacks))])]))
>
> That is, I can do it for the case-> clause that I care about. Putting the
> other two back in there causes it to fail type-checking. Is that the
> problem, that TR can’t accommodate both flavors in the same type?
>
> John
>
>
> --
> 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/aa1e77a8-9cc4-4f99-b413-1304daeec12b%40mtasv.net.
>

-- 
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/CAFUu9R6ncSV-MY%3DMDJjG%3DbsKVCjA3%3DDdGwJGNQfBVkTK70guqQ%40mail.gmail.com.

Reply via email to