我正在使用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我知道构建列表可能是构建这样一个列表的更好方法,但我感兴趣的是为什么这不起作用。
答案 0 :(得分:1)
如果包含ralist
,map
将重新定义为:
;; [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。