打字球拍:自然数字

时间:2014-10-29 05:34:33

标签: recursion racket typed-racket

我必须用自然数字的唯一定义来解决问题:

(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。

有没有人对编写这种类型的递归函数有任何建议。

1 个答案:

答案 0 :(得分:2)

问题在于您使用引用。当您引用列表时,请说出'(n m),但这并不意味着“包含n的列表以及m是什么 - 它表示包含文字符号<的列表/ em> nm。引用事物完全忽略了它们所拥有的任何绑定,并且只为你引用的任何内容提供 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

此表单允许您直接匹配参数,而不必首先将它们一起打包到列表中。