首页 > 解决方案 > string-append 似乎将字符串标识为列表

问题描述

我有以下代码,它应该返回具有 n 个节点的所有可能树的“列表表示”列表。这是我使用 mit-scheme 运行的代码:

(define form1
  (lambda (elem)
    (cond
     ((null? elem) '())
     (else (string-append "(" elem ".)")))))

OB(define form2
  (lambda (elem)
    (cond
     ((null? elem) '())
     (else (string-append "(." elem ")")))))

(define tree
  (lambda (n)
    (cond
     ((= n 1) '("(.)"))
     (else (cons (map form1 (tree (- n 1))) (map form2 (tree (- n 1))))))))

(tree 4)
(tree 1)

我得到以下相关输出:

1 ]=> (tree 4)
;The object ("((.).)"), passed as an argument to string-append, is not a string.
;To continue, call RESTART with an option number:
; (RESTART 1) => Return to read-eval-print level 1.

在我看来 elem 是一个字符串,那么为什么会出现这个错误呢?

标签: functional-programmingschememit-scheme

解决方案


您的错误消息说("((.).)")不是字符串。它是正确的。("((.).)")是一个字符串的列表,string-append仅适用于字符串而不是列表。

tree接受一个数字,要么返回一个字符串列表,要么返回一个树(列表列表)。由于结果tree被传递给mapform1很明显,当为 3form1时将获得一个字符串列表作为参数,因为将给出一个不兼容的类型,不能在.n(tree 2) ; ==> (("((.).)") "(.(.))") (map form1 (tree 2))("((.).)")string-append

我不知道这个过程应该做什么,但解决方案是清理预期的参数类型及其返回值,使其简洁。


推荐阅读