3

在 Scala 中,您可以执行以下操作:

def times[A](item: A, number: Int): List[A] = number match {
  case n if n <= 0 => Nil // Nil = '()
  case _ => 
    // equivalent to [_ (cons item (times item (- number 1)))]
    item :: times(item, number - 1)
}

是否可以使用 Racket 的形式做这样的事情match我在文档中找不到

对于那些不熟悉 Scala 的人来说,如果数字等于或小于 0,则第一种情况匹配,第二种情况只是匹配其他所有内容的通配符

换句话说,我会在???现场写什么来实现与我上面描述的类似的功能?

(define (times item number)
  (match number
    [??? '()]
    [_ (cons item (times item (- number 1)))]))
4

2 回答 2

3

Racketmatch有一个可选的#:when子句,可以让你几乎像在 Scala 中那样编写它:

(define (times item number)
  (match number
    [n #:when (<= n 0) '()]
    [_ (cons item (times item (- number 1)))]))

我认为这从字面上回答了你的问题。但更惯用的 Racket 将cond用于这样的事情——它是一个简单的条件测试,你不需要任何解构:

(define (times item number)
  (cond [(<= number 0) '()]
        [else (cons item (times item (- number 1)))]))

虽然我可能会翻转手臂:

(define (times item number)
  (cond [(positive? number) (cons item (times item (- number 1)))]
        [else '()]))

当然,对于这么简单的事情,您可以使用if

(define (times item number)
  (if (positive? number)
      (cons item (times item (- number 1)))
      '()))

cond但是,正如 Racket 样式指南所建议的那样,我已经越来越喜欢使用。

于 2014-09-04T13:16:19.943 回答
1

原来我看的不够努力,这是答案:

(define (times item number)
  (match number
    [(? (lambda (n) (<= n 0))) '()]
    [_ (cons item (times item (- number 1)))]))

(? expr patt)定义一个守卫。

上面的内容也许可以更简洁地写成:

(define (lteq-0? n) (<= n 0))

(define (times item number)
  (match number
    [(? lteq-0?) '()]
    [_ (cons item (times item (- number 1)))]))
于 2014-09-04T10:29:19.730 回答