2013-01-13 61 views
2

我的功能的目的是爲了增加5成整數,只要該整數大於0和小於或等於7。我嘗試:對於整數範圍模式匹配

val add5Partial : PartialFunction[Int, Int] = { 
    case d if (0 < d <= 7) => d + 5; 
} 

我得到:

<console>:8: error: type mismatch; 
found : Int(7) 
required: Boolean 
     case d if (0 < d <= 7) => d + 5; 

任何提示?

+0

OM-NOM-NOM(通過@ OM-NOM-NOM說話......註釋的)有答案。據我所知,_no_普通的現代編程語言允許使用這種簡寫符號。還要注意,你不需要圍繞Scala的守護表達式和分號的最外括號,這是非常糟糕的風格!此外,當您使用上下文綁定語法時,只能在冒號左側放置一個空格。 –

+0

@RandallSchulz python可以做到這一點。其實我已經看到scala郵件列表上的人也用scala完成了這個工作,但是還有一些額外的技巧。現在不能找到它。 –

+0

複製http://stackoverflow.com/questions/1346127/can-a-range-be-matched-in-scala。 – Glenn

回答

16

斯卡拉不支持這種語法開箱即用,所以你必須寫:

val partial : Int => Int = { 
    case d if (d > 0) && (d <= 7) => d + 5; 
} 

或者你可以這樣做:

val partial : Int => Int = { 
    case d if 1 to 7 contains d => d + 5; 
} 
3

你不能在一個比較中做到這一點。您需要使用:

(d > 0) && (d <= 7) 

正如你都做到了,它會評估一個比較布爾再不能利用這個作爲第二比較一個int。

1

你可以做任何以下內容:

val f = (n: Int) ⇒ if (n > 0 && n <= 7) n + 5 else n

//或...

def f(n: Int) = if (n > 0 && n <= 7) n + 5 else n
//

或...

def f(n: Int): Int = n match { 
    case n if n > 0 && n <= 7 ⇒ n + 5 
    case _ ⇒ n 
}

//或

def f(n: Int) = n match { 
    case n if 0 to 7 contains n ⇒ n + 5 
    case _ ⇒ n 
}