2012-12-03 12 views
10

Per qualche motivo (che mi sfugge), la libreria Scala math non ha una funzione pow per numeri interi, ma solo per Double s.Espressione del quadrato in Scala

Ho bisogno di una funzione quadrata per numeri interi e stava calcolando quale potrebbe essere il solito modo di farlo in 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) 
} 

Sono stato sorpreso di vedere che il carattere '²' non è piaciuto da Scala. Forse è considerato un numero? Di solito tutti i tipi di strani valori Unicode sono validi e usare 42 ² nel codice sarebbe, in effetti, di fantasia.

Non importa. Dovrei stare zitto e iniziare a usare la mia funzione pow2?

+0

I don pensate di sapere quale potere di due significhi veramente: https://en.wikipedia.org/wiki/Power_of_two –

+0

Così vero. Ha rifatto il titolo e il testo di conseguenza. Grazie. – akauppi

risposta

24

Sì, utilizzare il proprio pow2. Se hai bisogno di potenze più elevate, probabilmente non avrai spazio in uno Int. Considerare l'utilizzo di BigInt.pow:

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

Naturalmente, se non avete bisogno di N 2 ma 2 N, basta usare turni. (1 << k = 2 k) Questi funzionano anche con BigInt.

15

Usa apici inversi per i caratteri Unicode, e le classi implicite (Scala 2,10) per aggiungere il funzionamento sui tipi arbitrari:

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

Usage:

3 `²` 

Risultato:

9 
+3

Grande. Ma il tipo di zecche diluisce la bontà dell'uso effettivo di questo. Buon punto però. :) – akauppi

+0

Mi chiedo perché il parser/lexer richieda i backtick. –