shuki shtein
shuki shtein

Reputation: 75

Defining a function that accepts a List of Lists in racket

My assignment is to count how many lists I have with length 3 in my list (List of List). I thought I built everything correctly, but when I want to send the first list to my recursive function it fails because my list has the type Any, and I can't find a way to make it a list of lists.

#lang pl

(: count-3lists : (Listof Any) -> Number)
(define (count-3lists l)
  (cond
     [(null? l) 0]
     [else (+ (count-3lists-helper (first l)) (count-3lists (rest l)))]))

(: count-3lists-helper : (Listof Any) -> Number)
(define (count-3lists-helper l)
  (cond [(= (length l) 3) 1]
        [else 0]))

(: length : (Listof Any) -> Number)
(define (length l)
   (cond
      [(null? l) 0]
      [else (add1 (length (rest l)))]))

The error I get is:

. Type Checker: Polymorphic function `first' could not be applied to
arguments: 
Types: (Pairof a (Listof b)) -> (a : ((! False @ (car) (0 0)) | (False @ (car) (0 0))) : (car (0 0)))
       (Listof a) -> a
Arguments: (Pairof Any (Listof Any))
Expected result: (Listof Any)
 in: (first l)

Upvotes: 0

Views: 728

Answers (1)

Alex Knauth
Alex Knauth

Reputation: 8373

It seems like you want your count-3lists function to take a list of lists as its input. Right now you have (Listof Any).

What you want is express something like (Listof List), but the inner list has to be a list of something, so you can write that as (Listof (Listof Any)).

Then the first part of your code becomes this:

(: count-3lists : (Listof (Listof Any)) -> Number)
(define (count-3lists l)
  (cond
     [(null? l) 0]
     [else (+ (count-3lists-helper (first l)) (count-3lists (rest l)))]))

After that, the rest of your code works. It turns out that your length function was fine. (So you should probably rename your question.)

Upvotes: 2

Related Questions