具有列表的Scheme函数

时间:2013-04-16 05:42:10

标签: scheme

首先,我是计划的初学者。这也是基于HW的,所以我不是在寻找答案,而是在解释这里发生了什么。这是:

所以我有一个我需要实现的功能,给出了这么多:

(define gen-hash-division-method
  (lambda (size)
    ...
  ))

我已经实现的另一个函数被定义为key,并将一个单词作为参数并计算一些值。这是正确的所以我不会发布它,但作为一个例子key('(w o r d)) => 130293。现在所有'gen-hash-division-method'应该只根据参数取一个键的模数,换句话说就是h(k) = k modulus size

问题是,如果没有将k作为参数给出,我该如何计算呢?这就是'gen-hash-division-method'的用法:

(define hash-1 (gen-hash-division-method 701))

701我假设是尺寸参数。为了测试它,它看起来像这样:

(hash-1 '(h e l l o))

这是我感到困惑的地方,我不知道它在这里做了什么。这个词是在那里给出的但是我不明白我应该如何调用key('(h e l l o))来实现gen-hash-division-method(size) => k modulus size

1 个答案:

答案 0 :(得分:2)

我们来看看。 gen-hash-division-method根据size参数返回键的模数,但创建键的字符稍后将作为另一个参数传递,换句话说:

(define gen-hash-division-method
  (lambda (size)
    (lambda (chars)
      (modulo (key chars) size))))

这就是发生的事情:

  • gen-hash-division-method是一个函数,给定一个大小,返回另一个专门用于计算模数字大小的函数
  • 返回的函数作为参数接收字符列表
  • 一旦传递了一个字符列表,就会使用key过程计算密钥,然后执行模运算,始终使用创建函数时传递的size

我们刚刚实施的是currying的一个例子:

  curry是一种转换函数的技术,该函数采用多个参数(或参数元组),使得它可以被称为函数链,每个函数都有一个参数(部分应用程序)

如您所见,它按预期工作:

; hash-1 calculates hashes modulo 701
(define hash-1 (gen-hash-division-method 701)) 

; in particular, here we find the hash modulo 701 for '(h e l l o)
(hash-1 '(h e l l o))

; any other list of chars we pass will be hashed modulo 701
(hash-1 '(f o o))