functional-programming - 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 是一个字符串,那么为什么会出现这个错误呢?
解决方案
您的错误消息说("((.).)")
不是字符串。它是正确的。("((.).)")
是一个字符串的列表,string-append
仅适用于字符串而不是列表。
tree
接受一个数字,要么返回一个字符串列表,要么返回一个树(列表列表)。由于结果tree
被传递给map
,form1
很明显,当为 3form1
时将获得一个字符串列表作为参数,因为将给出一个不兼容的类型,不能在.n
(tree 2) ; ==> (("((.).)") "(.(.))")
(map form1 (tree 2))
("((.).)")
string-append
我不知道这个过程应该做什么,但解决方案是清理预期的参数类型及其返回值,使其简洁。
推荐阅读
- angular - Azure 应用服务 500 错误超时 Http Post
- jquery - 使用 JQuery 更改后如何从表中选择第一行?
- javascript - jQuery on click 循环通过相同的 .wrappers 中的图像独立
- android - 如何检查我的应用程序是否正在android中调试?
- asp.net - asp.net 样板 (ABP) OdataController 和 AddODataQueryFilter
- javascript - Vue / Vuetify - 如何对每个芯片项而不是整个选择输入进行验证
- elasticsearch - 弹性搜索,delete_by_query 需要很长时间才能完成并导致 http 请求超时
- hadoop - 如何删除 HDFS 中的快照?
- interface - 界面,Angular 5,反应形式
- mysql - 在mysql中按顺序求和?