我必须用自然数字的唯一定义来解决问题:
(define-type Nat (U 'Zero Succ))
(define-struct Succ ([prev : Nat]) #:transparent)
基本上,0 = 'Zero, 1 = (Succ 'Zero), 2 = (Succ (Succ 'Zero))....
等。
使用这个表单,不将它们转换成整数,我编写了递归函数来添加,减去和乘以自然数。对于添加功能,我已尝试过这个
(: nat+ : Nat Nat -> Nat)
(define (nat+ n m)
(match '(n m)
['('Zero 'Zero) 'Zero]
['((Succ p) 'Zero)
n]
['('Zero (Succ p))
m]
['((Succ p) (Succ t))
(nat+ p (Succ m))]))
但我收到了错误
p:模块中的未绑定标识符:p。
有没有人对编写这种类型的递归函数有任何建议。
答案 0 :(得分:2)
问题在于您使用引用。当您引用列表时,请说出'(n m)
,但这并不意味着“包含n
的列表以及m
是什么 - 它表示包含文字符号<的列表/ em> n
和m
。引用事物完全忽略了它们所拥有的任何绑定,并且只为你引用的任何内容提供 literal 解释。所以当你{{1}时},您 匹配包含值match '(n m)
和n
的列表,您将匹配包含符号m
和{{1在其他地方使用引用时存在类似的问题 - 在模式匹配子句中,您必须使用n
而不是引用来获得您期望的行为:
m
请注意,引用的使用仍保留在list
中 - 这是因为(: nat+ : Nat Nat -> Nat)
(define (nat+ n m)
(match (list n m)
[(list 'Zero 'Zero) 'Zero]
[(list (Succ p) 'Zero) n]
[(list 'Zero (Succ p)) m]
[(list (Succ p) (Succ t)) (nat+ p (Succ m))]))
不是与值的绑定,而是使用文字符号'Zero
,因此引用它。 / p>
此外,您可以使用define/match
表单:
Zero
此表单允许您直接匹配参数,而不必首先将它们一起打包到列表中。