2013-05-06 17 views
6

Ho pensato che questo dovrebbe essere semplice:Somma o prodotto dei numeri razionali con Spire (come ottenere uno scala.Numeric)

Credo che questo è solo una questione di portare la roba di destra in ambito implicito. Ma cosa importa?

posso vedere che, al fine di ottenere un RationalIsNumeric, devo fare qualcosa di simile:

import spire.math.Numeric._ 
implicit val err = new ApproximationContext(Rational(1, 192)) 
implicit val num = RationalIsNumeric 

Ma che appena mi dà un spire.math.Numeric. Così provo con questa aggiunta:

import spire.math.compat._ 

ma senza fortuna ...

+0

OT: per cosa stai usando la spira? – Edmondo1984

+1

Sto facendo calcoli ritmici (musicali). Le durate musicali sono solitamente espresse come razionali, quindi è necessario essere in grado di manipolare quelle :) E.g. data una cella ritmica con durate relative di 3, 2, 1 e una durata totale di 1/2, calcola le singole durate, trova alcuni fattori di allungamento che portano a denominatori piccoli ecc. –

risposta

8

tutto ciò che serve è la prova di spire.math.compat.numeric[Rational]:

import spire.math._ 

val seq = Vector(Rational(1, 4), Rational(3, 4)) 
implicit val num = compat.numeric[Rational] // ! 
seq.sum  // --> 1/1 
seq.product // --> 3/16 
6

E 'anche interessante notare che Spire fornisce le proprie versioni di sum e product che chiama qsum e qproduct:

import spire.implicits._ 
import spire.math._ 

Vector(Rational(1,3), Rational(1,2)).qsum // 5/6 

Spire ha come prefisso tutti i metodi di raccolta con q per evitare conflitti con i metodi incorporati di Scala. Ecco una (forse incompleto) elenco:

  • qsum
  • qproduct
  • qnorm
  • qmin
  • qmax
  • qmean
  • qsorted
  • qsortedBy
  • qsortedWith
  • qselected
  • qshuffled
  • qsampled
  • qchoose

Spiacente sono arrivato un po 'tardi per questo, io sono nuovo a StackOverflow.