假设我想实现一个相当有效的“关键字识别算法”,首先给出一个关键字列表,然后如果另一个给定的单词在列表中,则必须回答。
在命令式语言中,我会将关键字存储在树中(每个字符一个节点)。然后,当接收到要测试的单词时,我会扫描我的树以测试该单词是否是关键字。
我想了解如何用功能语言对这种算法进行编码。如何在保持“命令式”算法的效率的同时获得“无状态”编程的好处。如果您不想每次都重建它,是否有必要在查找之间的某处存储树?
假设我想实现一个相当有效的“关键字识别算法”,首先给出一个关键字列表,然后如果另一个给定的单词在列表中,则必须回答。
在命令式语言中,我会将关键字存储在树中(每个字符一个节点)。然后,当接收到要测试的单词时,我会扫描我的树以测试该单词是否是关键字。
我想了解如何用功能语言对这种算法进行编码。如何在保持“命令式”算法的效率的同时获得“无状态”编程的好处。如果您不想每次都重建它,是否有必要在查找之间的某处存储树?
我认为您的意思是每个节点一个字符...有点像用于关键字查找的简单哈希树方案。假设这种树甚至另一种树......想象一下做这样的事情(在伪 LISP 中):
(defun buildtree (wordlist) ...code to build tree recursively returns the tree...)
(define lookup (tree word) ...code to look up word using tree, returns t or nil...)
(defun lookupmany (tree querylist)
(if (eq querylist nil)
nil
(cons (lookup tree (car querylist)) (lookupmany tree (cdr querylist))
)
)
(defun main (wordlist querylist) ; the main entry point
(lookupmany (buildtree wordlist) querylist)
)
如果这就是你的意思,这是相当直接的函数式编程。真的是无国籍吗?这是一个有争议的问题。有人会说某些形式的函数式编程将我们通常所说的“状态”存储在堆栈上。此外,Common LISP 甚至从 Steele 书的第一版开始就具有迭代构造,而 LISP 拥有 setq 已经很长时间了。
但是在编程语言的理论中,我们所说的“无状态”是非常满足这里显示的想法的。
我认为上面的内容类似于您的意思。
我想你会想要像一棵带有孩子列表的树,如此处所述。