在Racket中映射RAList范围会返回空列表

时间:2014-08-16 20:15:41

标签: racket

我正在使用ralist并将范围映射到随机数函数,但我的结果是空列表。

#lang racket
(require data/ralist)
(map (lambda (_) (random 100))
     (range 10))

返回'(),而它应该返回10个随机数,对吗?

在摆脱ralist要求后,它有效:

#lang racket
(map (lambda (_) (random 100))
     (range 10))

返回:

  

(88 5 78 12 31 23 45 17 64 96)

单独执行范围可以使用和不使用require:

#lang racket
(range 10)

返回:

  

(0 1 2 3 4 5 6 7 8 9)

#lang racket
(require data/ralist)
(range 10)

也会返回:

  

(0 1 2 3 4 5 6 7 8 9)。

所以我不确定ralist是什么导致它或上面的行为不正确。

PS我知道构建列表可能是构建这样一个列表的更好方法,但我感兴趣的是为什么这不起作用。

1 个答案:

答案 0 :(得分:1)

如果包含ralistmap将重新定义为:

;; [X -> y] [RaListof X] -> [RaListof Y]
;; Takes advantage of the fact that map produces a list of equal size.
(define ra:map
  (case-lambda 
    [(f ls)
     (let recr ((ls ls))   
       (match ls
         [(struct kons (s t r))
          (make-kons s (tree-map f t) (recr r))]
         [else ra:empty]))]
    [(f . lss)
     (let recr ((lss lss))
       (cond [(ra:empty? (car lss)) ra:empty]
             [else
              ;; IMPROVE ME: make one pass over lss.
              (make-kons (kons-size (car lss))
                         (tree-map/n f (map kons-tree lss))
                         (recr (map kons-rest lss)))]))]))

合同规定它需要RaListof X。此模块重载(list)以创建RaListof,这就是为什么尝试:

#lang racket
(require (planet dvanhorn/ralist:3:5))
(map (lambda (_) (random 100))
    (list 0 1 2 3 4 5 6 7 8 9))
你会得到类似的东西:

(38 8 62 99 87 24 57 18 28 39)

我的建议:重新定义(range)以返回RaListof

以下是使用ALSO重新定义的(build-list)

的示例
(define (range n)
  (build-list n (lambda (x) x)))

编辑:

我将此函数添加到主RaList源as seen here