2012-01-29 119 views
3
佔位問題

考慮斯卡拉如下定義:關於斯卡拉

val f = ((_: Int) + 1).toString() 

代碼分配到F函數字面_ + 1,這是很自然的,除了字符串表示,這不是我想要的。我打算定義一個接受int參數的函數,將其加1並返回其字符串格式。

消除歧義,我必須寫一個lambda表達式有明確參數:

val g = (x: Int) => (x + 1).toString() 

因此我可以斷定,佔位符語法不適合複雜的函數文本? 或者是否存在一些規定函數文字範圍的規則?這似乎佔位符不能嵌套在括號(除了需要用於定義其類型的那些)功能字面

回答

7

是的,你認爲佔位符語法除簡單函數文字之外無用。

值得一提的是,您提到的特定情況可以用佔位符語法和函數組合的聯合來編寫。

scala> val f = ((_: Int) + 1) andThen (_.toString) 
f: Int => java.lang.String = <function1> 

scala> f(34) 
res14: java.lang.String = 35 
+0

謝謝。那麼我也在尋找什麼。我曾預料過類似於Haskell中的點運算符,但什麼也沒有發現。 – weidi 2012-01-29 12:18:05

+2

@weidi,'Function1#compose'相當於Haskell中的'.'。但是由於Scala的從左到右的流式推理,「Funtion1#和Then」使用起來更方便。 – missingfaktor 2012-01-29 12:51:22

3

似乎佔位符不能嵌套在括號內(除了需要用於定義其類型的那些)的函數文本內

這是正確的。請參閱placeholder syntaxuse case example的規則。

+0

謝謝。這些參考文獻幫助很多 – weidi 2012-01-29 12:15:49