【问题标题】:A list within a list is being passed as an empty list - Racket列表中的列表作为空列表传递 - 球拍
【发布时间】:2016-11-15 00:19:50
【问题描述】:

我在这里遇到了一个小问题。

假设我有一个列表,例如:

(define x '(("1" "one" "two" "2" "three") 
            ("2" "four" "five" "0" "six") 
            ("3" "seven" "eight" "4" "nine") 
            ("4" "ten" "eleven" "2" "twelve")))

所以我想要做的是获取这些列表中的每一个,并使每个列表中的元素成为单个字符串,例如:

“一一二二三”
“二四五零六”……

我设计了这些功能:

(define (get-sublista-from-lista lista)
  (if (list? (car lista))
      (car lista)
      lista))  

和:

(define (string-from-lista lista)
  (define (list-to-string lista str)
    (if (null? (cdr lista))
        (string-append str (car lista))
        (list-to-string (cdr lista)
                        (string-append str (car lista) " "))))
  (list-to-string lista ""))  

它们自己正常工作。但是每当我尝试将它们中的两个或其中一个与另一个组合时,例如:

(define (string-from-lista1 lista)
  (define (list-to-string lista str)
    (if (null? (get-sublista-from-lista lista))
        (string-append str (car (get-sublista-from-lista lista)))
        (list-to-string (cdr (get-sublista-from-lista lista))
                        (string-append str (car (get-sublista-from-lista lista)) ""))))
  (list-to-string lista ""))

然后主列表中的单个列表作为'()传递,导致合同违规,例如:

car: contract violation
  expected: pair?
  given: '()  

谁能解释我为什么会收到这样的错误?

【问题讨论】:

  • 我可以尝试给出一个pythonic的答案。如果有帮助,请联系我。
  • 它们各自正常工作,但不能一起工作?请具体说明会发生什么。他们在自己执行时会“做什么”,当您尝试一起执行时会发生什么?
  • 我知道它不能直接回答您的问题,但您可以使用内置插件来手动完成大部分操作。例如(apply string-append '("one " "two " "three ")) ;; "one two three "。创建一个将列表参数化的函数,删除多余的空格(或添加它们,具体取决于您的处理方式),然后创建另一个函数,该函数采用列表列表并将第一个函数映射到它们上。

标签: list racket is-empty


【解决方案1】:

内置函数string-join 用于将列表中的不同字符串连接成一个由默认字符空间分隔的字符串。使用map 将它应用到列表 x 的所有成员中,您将有一个短代码来完成此任务:

(map string-join x)

输出:

'("1 one two 2 three" "2 four five 0 six" "3 seven eight 4 nine" "4 ten eleven 2 twelve")

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2019-10-29
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多