2012-12-03 9 views
10

Z jakiegoś powodu (który mi umyka), biblioteka Scala math nie ma funkcji pow dla liczb całkowitych, ale tylko dla Double s.Wyrażanie kwadrat w Scala

Potrzebuję funkcji kwadrat dla liczb całkowitych i zastanawiałem się, co może być zwykły sposób to zrobić w Scala.

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) 
} 

Zaskoczyło mnie, że Scala nie lubi postaci "²". Może to być numer? Zwykle wszystkie rodzaje dziwnych wartości Unicode są poprawne, a użycie 42 ² w kodzie byłoby naprawdę wymyślne.

Nieważne. Czy powinienem się zamknąć i po prostu zacząć korzystać z mojej własnej funkcji pow2?

+0

I don Sądzisz, że wiesz, co to znaczy siła dwóch: https://en.wikipedia.org/wiki/Power_of_two –

+0

Tak prawdziwe. Zmień odpowiednio tytuł i tekst. Dzięki. – akauppi

Odpowiedz

24

Tak, użyj własnego pow2. Jeśli potrzebujesz większych mocy, prawdopodobnie nie będziesz miał miejsca w Int. Rozważyć użycie BigInt.pow:

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

Oczywiście, jeśli nie potrzebujemy N ale 2 N, wystarczy użyć przesunięcia. (1 << k = 2 k) Te działają również z BigInt.

15

Stosować backticks znaków Unicode oraz zajęcia niejawne (Scala 2.10), aby dodać operację na dowolnych typów:

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

Zastosowanie:

3 `²` 

Wynik:

9 
+3

Świetnie. Ale kleszcze niwelują prawdziwość korzystania z tego. Dobra uwaga. :) – akauppi

+0

Zastanawiam się, dlaczego parser/lexer wymaga backticks. –

Powiązane problemy