首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案高阶函数

方案高阶函数
EN

Stack Overflow用户
提问于 2021-09-27 23:47:51
回答 1查看 55关注 0票数 0

我尝试创建一个将列表中的二进制数转换为字符串的过程。示例输出:(binary->string '(1 1 0 1 0 0))应该提供"110100"

代码语言:javascript
复制
(define reduce
      (lambda (op base x) ;passing by name
        (if (null? x)
            base
            (op (car x) (reduce op base (cdr x))))))

下面是我的代码:

代码语言:javascript
复制
(define (binary->string lst)  
   (reduce (number->string lst list->string  )))

我知道这是错的,但这是迄今为止我做得最好的。请帮助我让它正常工作。

EN

回答 1

Stack Overflow用户

发布于 2021-09-28 07:06:24

在我向你展示解决方案之前,这里有一些建议:当你写球拍代码时,你应该检查参数的正确数量和它们的类型。

在本例中,您知道reduce需要(op base x),这是三个参数,但是当您使用一些未知的函数时,例如number->string,就会有Racket documentation,在简短的搜索之后,您将填充find number->string条目:

(数字->字符串z基数)→字符串?

Z:数字?

基数:(or/c 2 8 10 16) = 10

返回一个字符串,该字符串是以基数指定的基数中的z的打印形式(请参见打印数字)。如果z不精确,则基数必须为10,否则将引发exn:fail:contract异常。

示例:

(数字->字符串3.0)

"3.0“

(数字->字符串255 8)

"377“

正如您所看到的,您可以使用一个或两个参数调用此函数,但在这两种情况下,它们都必须为number。但是使用这个调用(number->string lst list->string ),您传递的是list和procedure-所以我已经可以断定您的代码将以错误结束。当你尝试在REPL中调用你的函数时,就会发生这样的事情:

代码语言:javascript
复制
> (binary->string '(1 0 0 1))
. . number->string: contract violation
  expected: number?
  given: '(1 0 0 1)
  argument position: 1st
  other arguments...:

在仔细检查所写的内容之后,甚至在运行代码之前,您应该能够预测会发生什么。

以下是解决方案:

代码语言:javascript
复制
(define (binary->string lst)
  (reduce string-append "" (map number->string lst)))

您将使用map从list中的每个数字创建字符串,然后使用reducestring-append连接这些字符串。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69354302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档