我试图创建一个函数,接受一个数字,然后产生文本,他们可以临时复制到他们的纸作为一个节省空间。以下是几个例子:
(define
CITATION-SPACE-2
(string-append
"[1] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[2] author information\n"
"title information\n"
"venue information\n"
"year & page information"))
(define
CITATION-SPACE-3
(string-append
"[1] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[2] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[3] author information\n"
"title information\n"
"venue information\n"
"year & page information"))
(check-expect (citation-space 2) CITATION-SPACE-2)
(check-expect (citation-space 3) CITATION-SPACE-3)我已经能够使用cond和string-append来定义函数了,但是我想不出如何在结果的每一行之间都有一个\n (虽然不是在最后一行之后)。另外,我不确定如何使用foldr列表抽象来定义和简化函数。
这就是我迄今尝试过的:
(define (citation-space num)
(local [; data-string : Nat -> String
; produces a space saver
; for a supplied number
(define (data-string num)
(foldl (λ (s1 s2)
(string-append s2 "\n" s1))
(string-append
"[" (number->string num) "]"
" author information")
(list "title information"
"venue information"
"year & page information")))]
(cond
[(zero? num) ""]
[(= num 1) (data-string 1)]
[else (string-append
(citation-space (sub1 num))
"\n"
(data-string num))])))发布于 2022-06-21 17:33:14
如果您不必在ISL中进行此练习,则可以使用由string-join提供的racket/string。
如果不必使用foldl或foldr,则可以编写如下内容:
(define (my-join strs sep)
(cond ((null? strs) "")
((= (length strs) 1) (first strs))
(else (string-append (first strs)
sep
(my-join (rest strs) sep)))))但是我认为用一对foldl也可以解决这个问题。使用的语言是中间学生与Lambda:
(define
CITATION-SPACE-2
(string-append
"[1] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[2] author information\n"
"title information\n"
"venue information\n"
"year & page information"))
(define
CITATION-SPACE-3
(string-append
"[1] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[2] author information\n"
"title information\n"
"venue information\n"
"year & page information\n"
"[3] author information\n"
"title information\n"
"venue information\n"
"year & page information"))
(define (data-string number)
(foldl (lambda (s result)
(string-append result "\n" s))
(format "[~a] author information" number)
(list "title information"
"venue information"
"year & page information")))
(define (citation-space number)
(if (zero? number) ""
(let ((strs (map data-string (range 1 (add1 number) 1))))
(foldl (lambda (s result) (string-append result "\n" s))
(first strs)
(rest strs)))))
(check-expect (citation-space 2) CITATION-SPACE-2)
(check-expect (citation-space 3) CITATION-SPACE-3)编辑:一个foldl的解决方案
(define (data-string number)
(foldl (lambda (s result)
(string-append result "\n" s))
(format "[~a] author information" number)
(list "title information"
"venue information"
"year & page information")))
(define (citation-space num)
(cond
[(zero? num) ""]
[(= num 1) (data-string 1)]
[else (string-append
(citation-space (sub1 num))
"\n"
(data-string num))]))https://stackoverflow.com/questions/72703607
复制相似问题