2013-10-03 216 views
1

(真的很糟糕的標題)在Scala中泛型類型的函數成員參數類型的推斷?

無論如何:我可以以某種方式讓Scala推斷第二行中的b的類型嗎?

scala> class A[B](val b: B, val fun: B => Unit) 
defined class A 

scala> new A("123", b => { }) 
<console>:9: error: missing parameter type 
       new A("123", b => { }) 
         ^

這個工程將類型後預期:

scala> new A("123", (b: String) => { }) 
res0: A[String] = [email protected] 

而且String肯定是預期的類型:

scala> new A("123", (b: Int) => {}) 
<console>:9: error: type mismatch; 
found : Int => Unit 
required: String => Unit 
       new A("123", (b: Int) => {}) 
            ^

回答

4

對於這樣的情況在Scala中,像在許多其他語言,柯曲的概念存在:

scala> class A[B](val b: B)(val fun: B => Unit) 
defined class A 

scala> new A("string")(_.toUpperCase) 
res8: A[String] = [email protected] 

您也可以用case類簡化此:

scala> case class A[B](b: B)(fun: B => Unit) 
defined class A 

scala> A("string")(_.toUpperCase) 
res9: A[String] = A(string) 

至於你的例子:

new A("123", (b: Int) => {}) 

你不能做到這一點,在類聲明兩個參數有通用型B,這樣既參數必須具有相同的類型

+0

謝謝,我會使用柯里裏,如你所建議的。 :)(但我還是不明白,爲什麼不能在我的例子中推導這個類型。) –

+2

@MichałRus這是對Scala類型推斷的一個限制,你不能對這個 – 4lex1v

+0

Kthx做任何事情。 :)漂亮的頭髮,順便說一句。 –