我的任务是计算我的列表中的长度为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)
答案 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
功能很好。 (所以你应该重命名你的问题。)