Thanks, following Ben's suggestion that follow code works 

#lang typed/racket
;; 
(require pfds/stream)
;; 
(define-type (OverFoldable A) (-> (Listof A) A))
;; 
(define-type (FibStreamCons A) (-> (Listof A) (Stream A)))
;; 
(define-type (FibStream A) (-> (OverFoldable A) (Listof A) (Stream A)))
;; 
(: sum (OverFoldable Number))
(define (sum xs) (apply + xs))
;; 
(: gfib (FibStream Number))
(define (gfib f xs)
  (: gfib_t (FibStreamCons Number))
  (define (gfib_t ys) 
    (stream-cons (last ys) (gfib_t (append (cdr ys) (list (f ys))))))
  (stream-append (apply stream (drop-right xs 1)) (gfib_t xs)))
;; 
(: gfib_2 (All (A) (FibStream A)))
(define (gfib_2 f xs)
  (: gfib_t (FibStreamCons A))
  (define (gfib_t ys) 
    (stream-cons (last ys) (gfib_t (append (cdr ys) (list (f ys))))))
  (stream-append (apply stream (drop-right xs 1)) (gfib_t xs)))
;; 
(define gfib2_0 
  (gfib sum '(0 1)))
;; 
(stream->list (take 30 gfib2_0))
;; 
(define gfib2_1 
  (gfib_2 sum '(0 1)))
;; 
(stream->list (take 30 gfib2_1))
;; 
(= (last (stream->list (take 201 gfib2_1)))
   (last (stream->list (take 201 gfib2_0))))
;; typed_racket_test.rkt ends here



On Tuesday, July 13, 2021 at 9:11:01 PM UTC-5 Ben Greenman wrote:

> On 7/13/21, Kiong-Gē Liāu <gongy...@gmail.com> wrote:
> > Ben,
> >
> > Thanks, changing "stream" to "stream apply" does solve the issue.
> >
> > I tried to push it further little bit with the following code to see if
> > typed racket can support generic like Haskell or Scala:
> >
> > #lang typed/racket
> >
> > (require pfds/stream)
> >
> >
> > (define-type (OverFoldable A) (-> (Listof A) A))
> >
> > (define-type (FibStreamCons A) (-> (Listof A) (Stream A)))
> >
> > (define-type (FibStream A) (-> (OverFoldable A) (Listof A) (Stream A)))
> >
> > (: sum (OverFoldable Number))
> > (define (sum xs) (apply + xs))
> >
> > (: gfib_2 (All (A) (FibStream A)))
> > (define (gfib_2 f xs)
> > (: gfib_t (All (A) (FibStreamCons A)))
> > (define (gfib_t ys)
> > (stream-cons (last ys) (gfib_t (append (cdr ys) (list (f ys))))))
> > (stream-append (apply stream (drop-right xs 1)) (gfib_t xs)))
> >
> > However, I got the following error message:
> >
> > ; /home/kiong-ge/Programming/Racket/typed_racket_test.rkt:28:61: Type
> > Checker: type mismatch
> > ; expected: (Listof A)
> > ; given: (Listof A)
> > ; in: ys
> >
> > But, according to this error message, expected and given types are 
> exactly
> > the same, not sure how to deal with this issue.
>
> I think the problem is 2 different type variables that both print as
> the letter A.
>
> When I remove the "All" from the type for gfib_t (FibStreamCons A), it
> typechecks.
>

-- 
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 racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/441cdf96-532a-4c7e-9f03-dedce52508c3n%40googlegroups.com.

Reply via email to