2014-09-04 23 views
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) 
} 

是否有可能使用球拍的match形式做這樣的事情?在documentation

對於那些不熟悉斯卡拉我找不到它,第一種情況下,如果匹配的數量等於或小於0,第二種情況是隻是一個符合一切通配符

換句話說,我會在???現場寫些什麼來實現類似我上面描述的功能?

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

回答

3

球拍的match有一個可選的#:when條款,可以讓你寫這幾乎完全一樣,你在斯卡拉做:

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

我想從字面上回答你的問題。但更地道的球拍是使用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喜歡,正如球拍風格指南所建議的那樣。

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)))])) 
+1

我不認爲你會在球拍中使用match。 – uselpa 2014-09-04 12:52:05

+0

@uselpa這只是一個簡單的例子,當然如果或cond會更合適 – 2014-09-05 06:39:39