定义一个接受球拍列表列表的功能

时间:2016-05-03 21:02:51

标签: racket typed-racket

我的任务是计算我的列表中的长度为3的列表(列表列表)。 我以为我正确地构建了所有内容,但是当我想将第一个列表发送到我的递归函数时,它会失败,因为我的列表的类型为Any,而我无法找到使其成为列表列表的方法。

#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)))]))

我得到的错误是:

. 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)

1 个答案:

答案 0 :(得分:2)

您似乎希望count-3lists函数将列表列表作为输入。现在你有(Listof Any)

你想要的是表达类似列表(Listof List),但内部列表必须是某个列表,所以你可以把它写成(Listof (Listof Any))

然后代码的第一部分变为:

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

之后,其余代码可以正常运行。事实证明你的length功能很好。 (所以你应该重命名你的问题。)