gpt4 book ai didi

scala - 在 Racket 中你是如何与守卫匹配的?

转载 作者:行者123 更新时间:2023-12-01 12:40:08 24 4
gpt4 key购买 nike

在 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 来做这样的事情?形式?我在 documentation 中找不到它

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

换句话说,我会在 ??? 中写什么?点来实现与我上面描述的类似的功能?
(define (times item number)
(match number
[??? '()]
[_ (cons item (times item (- number 1)))]))

最佳答案

Racket 的match有一个可选的 #: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)))]))

虽然我可能会翻转 ARM :
(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 风格指南所推荐的那样。

关于scala - 在 Racket 中你是如何与守卫匹配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com