2012-12-03 14 views
10

Bazı nedenlerden dolayı (bu bana kaçar), Scala math kitaplığında tamsayılar için pow işlevine sahip değil, yalnızca Double s.Scala'da kare ifade etme

Tamsayılar için kare bir fonksiyona ihtiyacım var ve bunu Scala'da yapmak için her zamanki yolun ne olabileceğini düşünüyordum.

object TestX extends App { 

    def pow2(v: Int)= v*v 

    //class MyRichInt(val v: Int) { 
    // def ² : Int = v*v  // says: "illegal character" for UTF-8 power-of-two 
    //} 

    println(pow2(42)) 
    //println(42²) 
    println(math.pow(42,2).toInt) 
} 

'²' karakterinin Scala tarafından beğenilmediğini görmek beni şaşırttı. Belki bir numara olmak için alınır? Genellikle her türlü tuhaf Unicode değeri geçerlidir ve 42 inç kod kullanılarak, gerçekten de fantezi olur.

Boşver. Çeneni kapatıp kendi pow2 işlevimi kullanmaya başlamalı mıyım?

+0

ı don İki şeyin gücünün ne anlama geldiğini bildiğini düşünün: https://en.wikipedia.org/wiki/Power_of_two –

+0

Yani doğru. Başlığı ve metni buna göre yeniden yazdı. Teşekkürler. – akauppi

cevap

24

Evet, kendi pow2 numaralı telefonu kullanın. Daha yüksek güçlere ihtiyacınız varsa, muhtemelen bir Int içinde yer almayacaksınız. BigInt.pow kullanmayı düşünün: Elbette

scala> BigInt(40).pow(40) 
res0: scala.math.BigInt = 12089258196146291747061760000000000000000000000000000000000000000 

, sadece vardiya kullanmak, N ama N 2 değil gerekirse. (1 << k = 2 k) Bunlar da BigInt ile çalışır.

15

Kullanım Unicode karakterleri için backticks ve örtük sınıfları (Scala 2.10) keyfi türlerinde operasyonu eklemek için:

implicit class PowerInt(i: Int) { 
    def `²`: Int = i * i 
} 

Kullanımı:

3 `²` 

Sonuç:

9 
+3

Harika. Fakat kene, aslında bunu kullanmanın güzelliğini sulandırır. İyi bir nokta olsa da. :) – akauppi

+0

Parser/lexer neden backticks gerektirir merak ediyorum. –