首先,我是计划的初学者。这也是基于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
答案 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))