2016-10-04 68 views
-1

這是我的代碼。爲什麼下劃線擴展不像我在Scala中預期的那樣?

val b = a map { f(x => x.length) } // absolutely wrong 

這就是爲什麼有一個錯誤:當計算B,好像編譯器擴展以下列方式的代碼發生

def f(x: Int) = x 
val a = List(List(1), List(2, 2)) 

val b = a map { f(_.length) } // error 
val c = a map { item => f(item.length) } // no error 

錯誤。正確的擴展與我在計算c時所做的相似。但是,編譯器如何擴展函數f函數f不指望函數?

對我來說,這種擴展沒有任何意義。誰能解釋這種行爲?謝謝!

+1

它按預期展開。只是你的期望是不正確的。如果你考慮將整個事物與模式匹配進行比較......你應該能夠看到出了什麼問題。雖然......它不完全正確......爲了理解,只要想到一個'.map(_。length)'就像這個'map(x => x match {case _ => x .length})'。現在你寫的是'a.map(f(x => x match {case _ => x.length}))' –

+0

@Micho我不同意它是這個問題的重複。那裏的答案只是說_how_佔位符語法被擴展了,但問題作者已經知道了。 –

+0

@SarveshKumarSingh Thx!你的例子真的幫助我:) –

回答

0

但是,當函數f不期望函數時,編譯器如何擴展函數f?

因爲這種擴展發生在鍵入之前:編譯器不知道什麼f期待什麼。這是一件好事,因爲1)當閱讀你的代碼時不需要知道f是否期望函數能夠理解它將如何擴展; 2)改變f的類型不會從根本上改變代碼的含義。

相關問題