Lambda 将符号映射到值,然后返回查找值的过程(racket)
这件事已经困扰了我好几天了。以下是我想做的: 假设我有一些符号列表。(A、B、C、D)。我想将这些符号映射到值。假设我的值是“(1 2 3 4) 好的,现在是目标。我想写一个过程,它将返回一个我可以稍后再次调用的过程。这就是我的意思: (定义获取映射值(将符号和值映射在一起)) (获取映射值“A”) 应该返回'1' 到目前为止,我已经编写了一个过程,将两个列表“压缩”在一起,基本上映射值。因此,给定'(abcd)和'(1234),它将返回((a1)(b2)(c3)等等 我还编写了一个过程,给定一个符号将返回它的映射值。但我很难把这一切都联系起来,也无法做出定义。我最近的一次尝试是:Lambda 将符号映射到值,然后返回查找值的过程(racket),lambda,mapping,scheme,racket,procedure,Lambda,Mapping,Scheme,Racket,Procedure,这件事已经困扰了我好几天了。以下是我想做的: 假设我有一些符号列表。(A、B、C、D)。我想将这些符号映射到值。假设我的值是“(1 2 3 4) 好的,现在是目标。我想写一个过程,它将返回一个我可以稍后再次调用的过程。这就是我的意思: (定义获取映射值(将符号和值映射在一起)) (获取映射值“A”) 应该返回'1' 到目前为止,我已经编写了一个过程,将两个列表“压缩”在一起,基本上映射值。因此,给定'(abcd)和'(1234),它将返回((a1)(b2)(c3)等等 我还编写了一个过程,给定一
(define map-together
(case-lambda
[(symbols vals) (lambda (cons lst (zip-together keys vals))]
[(symbol) (find-mapped-value symbol)]
)
)
)
但这只是返回压缩列表。解决方案比您想象的要简单一点-只要正确实现了
查找映射值,这应该可以工作:
(define (map-together keys vals)
(let ((alist (zip-together keys vals)))
(lambda (key)
(find-mapped-value key alist))))
说明:首先,使用zip-together
创建一个关联列表(称为alist
)。该列表对于所有搜索都是相同的,因此我们可以将其包含在返回过程之外
然后,返回一个处理在关联列表中查找键的过程,注意我修改了find mapped value
——现在它接收到搜索键和关联列表
为了好玩,另一种解决方法是使用assoc
,因为该过程已经执行了查找映射值的工作
(define (map-together keys vals)
(let ((alist (map list keys vals))) ; same as zip-together
(lambda (key)
(cond ((assoc key alist) => second) ; similar to find-mapped-value
(else #f)))))
当然,对于大型列表,更有效的解决方案是使用哈希表:
(define (map-together keys vals)
(let ((mapping (make-hash (map cons keys vals))))
(lambda (key)
(hash-ref mapping key (const #f)))))
上述所有实现都按预期工作,如果映射中不存在键,它们将返回\f
:
就快到了
(define (map-together)
(let ((a-list '()))
(case-lambda
[(symbols vals)
(begin (set! a-list (cons lst (zip-together keys vals)))
a-list)]
[(symbol) (find-mapped-value symbol)])))
无论如何,局部变量应该会有帮助。你应该这样使用它
(定义alphebet值(一起映射))
(字母值(列表'a'b'c'c'(列表1 2 3 4))
(alphebet值'c)
-->三,
不确定这是否是您想要的。对于较大的值,您可能希望使用哈希表或红黑树,而不是关联列表。Racket应该在某个模块中提供这两种的实现
如果您使用(VAL)符号调用旧的a列表,此实现将覆盖该函数。如果您需要可以附加和更新a列表的内容,它会变得有点棘手。您的映射到一起
函数需要返回一个函数,该函数接受一个符号并返回一个值。返回的值将基于将符号映射到值的表。因此:
(define (map-together symbols values)
(let ((table (map cons symbols values)))
(lambda (symbol)
(cond ((assq symbol table) => cdr)
(else #f)))))
> (define get-mapped-value (map-together '(a b c d) '(1 2 3 4)))
> (get-mapped-value 'a)
1
使用(map cons symbols values)
将符号到值的映射实现为方案关联列表。使用该关联列表,我们可以使用assq
查找关联中的对;如果存在这样的对,则cdr
就是值
请注意,由于表没有更改,因此我们根据在lambda
之外创建的词法变量table
定义要返回的函数,如果它没有访问关联列表的权限,find mapped value
将如何工作?另请注意:关联列表只应构建有一次,没有必要在每次搜索密钥时都重新创建它。很抱歉,响应延迟。感谢您的帮助。我将不得不深入了解您的答案,以全面了解此问题的各个方面。lambda正在绊倒我。
(define (map-together symbols values)
(let ((table (map cons symbols values)))
(lambda (symbol)
(cond ((assq symbol table) => cdr)
(else #f)))))
> (define get-mapped-value (map-together '(a b c d) '(1 2 3 4)))
> (get-mapped-value 'a)
1