2011-03-16 14 views
8

sağlamak için nasıl bir tipleme madde ile Scala'da küçük bir sorun var. Haskell, ben bunu yapabilirsiniz:Scala Yazma: Sayısal Tipi

:

add :: (Num a) => (a,a) -> (a,a) -> (a,a) 

Bu şekilde, ben add içine sayısal ve destekler + vb Bir Scala sınıf için aynı istiyoruz, bu yüzden gibi her türlü atabilir

case class NumPair[A <: Numeric](x: A, y: A) 

Ancak bu işe yaramaz. Bu işlemler için izin verir ve görünüyor sadece sürekli Int daha uzatılması Ama Scala Dokümanlar nedeniyle Numeric[T] edilir Float vb

Herhangi bir ipucu?

cevap

11
case class NumPair[A](x:A, y:A)(implicit num:Numeric[A]) 

Numeric örneğinin kendisi vb Int, Float, uzatılabilir değildir, ama üstü kapalı bir nesne olarak sağlanır. Daha uzun bir açıklama için, bkz. here. İşe kaydetmek istiyorsanız onlar oldukça güzel, ama genellikle tip çıkarımlar örterek yazarak sistemini tahrip - Ben `implicit`s isterim eğer

+0

emin değilim. – Lanbo

+1

Hangi yol belirsiz tür çıkarımını ima eder? - İsterseniz, "Numeric" örneğini açık bir parametre haline getirebilirsiniz, ancak daha sonra her zaman açık bir şekilde iletmeniz gerekir. Bu, Int ', Float gibi türler için gerçekten gereksizdir. Açıkça geçmek isteyip istemediğinizi seçebilirsiniz. – Madoc