Alf*_*ong 5 lisp scheme functional-programming racket map-function
基本上,我想使用map在列表中做选择
(define tbl '(a b c d))
(map (lambda (item 'c) (if (eq? item 'c) item (...what in else?) )))
Run Code Online (Sandbox Code Playgroud)
我想要的结果是
'(c)
Run Code Online (Sandbox Code Playgroud)
我尝试将其他部分留空,它抱怨需要其他部分.我试过了
(display "foo")
Run Code Online (Sandbox Code Playgroud)
作为其他部分并得到了
(#<void> #<void> c #<void>)
Run Code Online (Sandbox Code Playgroud)
那很接近.
有什么方法可以使用地图来获得'(c)?我知道递归的方式,但我想知道地图是否也能做到.如果不是'(c),至少(## c#)但没有使用display hack来实现void类型的返回值.
Ósc*_*pez 12
您想要使用filter,而不是map- 因为输出列表可能包含的元素少于输入列表.#<void>返回的所有值display都在那里因为map将始终在输出列表中包含结果,即使对于我们不感兴趣的那些元素也是如此.
(define tbl '(a b c d))
(filter (lambda (item) (eq? item 'c)) tbl)
=> '(c)
Run Code Online (Sandbox Code Playgroud)
等价,有点短:
(filter (curry eq? 'c) tbl)
=> '(c)
Run Code Online (Sandbox Code Playgroud)
map当您想对输入列表中的每个元素执行某些操作而不丢弃元素时使用.另一方面,filter用于选择输入列表中的某些元素,#t为给定谓词求值的元素,并且filter在大多数Scheme解释器中可用,如果它不可用,则可以导入SRFI-1或使用参考实现.
有没有办法来获得'(c)使用只 map(它可以被黑客攻击利用map加apply或remove*等,但是这不是想法,是吗?); 如果由于某种原因你只需要使用map并且不介意返回带有占位符的列表,这里有几个选择:
(map (lambda (item) (if (eq? item 'c) item '%)) tbl) ; placeholder in else part
=> '(% % c %)
(map (lambda (item) (when (eq? item 'c) item)) tbl) ; when has implicit #<void>
=> '(#<void> #<void> c #<void>)
Run Code Online (Sandbox Code Playgroud)
时间有点黑客了.使用mapplus apply(如@WillNess'答案中所述),这具有在任何RxRS解释器中工作的优点,并且是最便携的解决方案,因为它使用标准过程:
(apply append (map (lambda (item) (if (eq? item 'c) (list item) '())) tbl))
=> '(c)
Run Code Online (Sandbox Code Playgroud)
使用map加号remove*:
(remove* (list (void)) (map (lambda (item) (when (eq? item 'c) item)) tbl))
=> '(c)
Run Code Online (Sandbox Code Playgroud)
对于更改,没有map- 使用的解决方案foldr:
(foldr (lambda (item a) (append (if (eq? item 'c) (list item) '()) a)) '() tbl)
=> '(c)
Run Code Online (Sandbox Code Playgroud)
当然,您始终可以filter使用标准过程来实现自己的版本,这也可以在所有RxRS解释器中移植:
(define (filter pred? lst)
(cond ((null? lst)
'())
((not (pred? (car lst)))
(filter pred? (cdr lst)))
(else
(cons (car lst)
(filter pred? (cdr lst))))))
(filter (lambda (item) (eq? item 'c)) tbl)
=> '(c)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
546 次 |
| 最近记录: |