#lang plai racket multiplier功能

时间:2015-02-04 10:28:52

标签: tree programming-languages racket plai

我正在开展一个让我们习惯使用plai类型语言的项目,用于编程语言课程。我一直困在一个问题上,这个问题真的让我烦恼(完成所有其余的没问题)。我们将采用此数据类型定义:

(define-type Tree
[leaf (val number?)]
[node (val number?)
(left Tree?)
(right Tree? ) ] ) 

然后"实现' scaled',它取一棵树并返回一个形状相同的树, 但是所有的值都乘以给定的比例。

示例:(缩放(节点-5(叶6)(叶-7))2)应该产生(节点-10 (叶子12)(叶子-14))"

所以基本上我只需要将给定值的所有值多处多处,在本例中为2.

以下是我尝试不同方法后到目前为止的情况:

(define (scaled [ t Tree?] [n  number?] )  
(type-case Tree t  
[leaf (val) val] 
[node (val left right) ( * val (scaled left) (scaled right)  n  ) ] ) )    

我的基础是我为我正确分配的其他部分创建的先前代码。问题是,它将所有数字和结果成倍增加"成功"使用420的解决方案,而不是单独使用多个值。我知道这与我放置的' n'但我尝试了很多不同的方法,没有运气。如果有人有任何有用的提示/技巧/解决方案,将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

考虑问题的方法不是降低到较低的实施水平,而是达到我们可以考虑scaled的水平。问题不在于确定放置n的位置。它弄清楚scaled应该做什么。

无论它做什么,它都需要返回一棵树。

; DefType F1 : Any -> Tree
(define (f1 x)
  (leaf 42))

下一个最重要的是它需要以树为输入。

; DefType F2 : Tree -> Tree
(define (f2 [t Tree?])
  (leaf 42))

接下来必须解决的输入和输出之间存在同构现象。输出树的结构需要与输入树的结构相匹配。

; DefType F3 : Tree -> Tree
(define (f3 [t Tree?])
  t)

这使我们得到了我们想要的东西,但是从功能编程的角度来看质量是因为f3返回对输入的引用而不是从输入派生的值。该函数需要返回一个与输入值具有相同结构的新输出值。要复制结构,函数在传递node时必须返回node,在传递leaf时返回leaf

; DefType F4 : Tree -> Tree
(define (f4 [t Tree?])
  (type-case Tree t
    [leaf (val) (leaf val)]
    [node (val left right)
       (node val (f4 left)(f4 right))]))

现在已经整理了类型,现在是时候处理将输入树转换为输出树了。这需要提升一个级别而不是下降。开始的地方是重写f4

; DefType F5 : Tree -> Tree
(define (f5 [t Tree?])
  (type-case Tree t
    [leaf (val) (leaf (id val))]
    [node (val left right)
      (node (id val) (f5 left)(f5 right))]))

重要,但不是很有趣。用任意函数替换id似乎更有趣。非常有趣,它可能值得添加第二个论点。

; DefType N2N : Number -> Number
; DefType F6 : Tree (Number -> Number) -> Tree
(define (f6 [t Tree?] [n2n N2N?])
  (type-case Tree t
    [leaf (val) (leaf (n2n val))]
    [node (val left right)
      (node (n2n val) (f6 left) (f6 right))]))

函数scaled

; DefType Scaled : Tree Number -> Tree
(let ((f lambda(x y)(* x y)))
  (define (scaled [t Tree?][n Number?])
    (type-case Tree t
      [leaf (val)(leaf (f n val))]
      [node (val left right)
        (node (f n val) (scaled left)(scaled right))])))