首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用球拍ISL定义函数使用列表抽象

使用球拍ISL定义函数使用列表抽象
EN

Stack Overflow用户
提问于 2022-06-21 15:38:16
回答 1查看 67关注 0票数 0

我试图创建一个函数,接受一个数字,然后产生文本,他们可以临时复制到他们的纸作为一个节省空间。以下是几个例子:

代码语言:javascript
复制
(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列表抽象来定义和简化函数。

这就是我迄今尝试过的:

代码语言:javascript
复制
(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))])))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-21 17:33:14

如果您不必在ISL中进行此练习,则可以使用由string-join提供的racket/string

如果不必使用foldlfoldr,则可以编写如下内容:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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解决方案

代码语言:javascript
复制
(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))]))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72703607

复制
相关文章

相似问题

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