PasteRack.org
Paste # 70672
2023-11-19 19:37:10

Fork as a new paste.

Paste viewed 593 times.


Embed:

  1. #lang typed/racket
  2.  
  3. (define-type (->esc A) (-> A Nothing))
  4. (define-type (SplitAnswer A) (Rec R (U False (List A (-> Any R)))))
  5. (define-type (Visitor A) (-> String String (U A False)))
  6.  
  7. (: each-split (All (A) (-> String (-> (Visitor A) (SplitAnswer A)))))
  8. (define (each-split s)
  9.   (let ((n (string-length s)))
  10.     (lambda (f)
  11.       (call-with-current-continuation
  12.        (lambda ((ret : (->esc (SplitAnswer A))))
  13.          (: loop (-> Natural (->esc (SplitAnswer A)) Nothing))
  14.          (define (loop i ret)
  15.            (cond ((> i n) (ret #f))
  16.                  ((f (substring s 0 i) (substring s i n))
  17.                   => (lambda (result)
  18.                        (loop (+ i 1)
  19.                              (call-with-current-continuation
  20.                               (lambda ((resume : (->esc (->esc (SplitAnswer A)))))
  21.                                 (ret (list result (lambda (x)
  22.                                                     (call-with-current-continuation
  23.                                                      (lambda ((caller : (->esc (SplitAnswer A))))
  24.                                                        (resume caller)))))))))))
  25.                  (else
  26.                   (loop (+ i 1) ret))))
  27.          (loop 0 ret))))))
  28.  
  29. (define-type Split (List String String))
  30.  
  31. (: all-splits (-> String (Listof Split)))
  32. (define (all-splits s)
  33.   (: loop (-> (SplitAnswer Split) (Listof Split)))
  34.   (define (loop result)
  35.     (cond (result
  36.            (cons (car result)
  37.                  (loop ((cadr result) 'next))))
  38.           (else '())))
  39.   (loop ((each-split s) list)))

=>

eval:9:0: Type Checker: type mismatch

  expected: (Rec g5082 (U (List Split (-> Any g5082))

False))

  given: (Rec g5083 (U (List Any (-> Any g5083)) False))

  in: list