Lambda 将符号映射到值,然后返回查找值的过程(racket)

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)等等 我还编写了一个过程,给定一

这件事已经困扰了我好几天了。以下是我想做的:

假设我有一些符号列表。(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