0
次の定義された構造体と型には、2つの数値の乗算が必要です。それをするのに困っている。アドバイスをいただければ幸いです。型付き/ラケット:指定された自然数定義型は、2つの数値を乗算する必要があります。
(define-struct Zero())
(define-struct Succ
([n : Nat]))
(define-type Nat (U Zero Succ))
(: one Nat)
(define one (Succ (Zero)))
(: two Nat)
(define two (Succ one))
(: sub-nat : Nat Nat -> Nat)
(define (sub-nat a y)
(cond
[(Zero? a) a]
[(eq? one y)
(- a y)]))
(: add-nat (-> Nat Nat Nat))
(define (add-nat a b)
(cond
[(Zero? a) b]
((Zero? b) a)
[else (add-nat (Succ-n a) (Succ b))]))
(: multiply-nat : Number Nat -> Nat)
(define (multiply-nat a b)
(cond
[(Zero? a) a]
[(Zero? b) b]
[else
(add-nat b (multiply-nat (sub-nat a one) b))]))
:テスト目的のために
、私はまた、実際の数字に教会の数字を変換するための
nat->number
機能を書きましたそれらのブランチでは依然としてゼロになるからです。問題はあなたのバージョン( '(Succ-n a)'を使って)とオリジナル( ''サブナート ''を使って)の間で実際に異なる唯一のものであるため、 nat a one) ')。 –@AlexKnauth OPのケースを再度読んで、彼らのベースケースもうまくいくと思う。はい、サブルーチンの実装は破棄され、タイプチェックは行われません。また、 'add-nat'はすでに' Succ-n'を使用しているので、 'multiply-nat'もそれを使うべきです。 –
これを編集して 'sub-nat'が間違っていると指定し、ベースケースだけを残しておきますか? –