Récemment, j'ai (enfin) commencé à utiliser le trait numérique de Scala, qui fait des merveilles. Par exemple:Mathématiques plus avancées avec les nombres numériques et fractionnaires de Scala
def square[A](x: A)(implicit num: Numeric[A]): A = num.times(x, x)
Maintenant, je peux carré un nombre que ce soit Double
, Integer
, BigDecimal
, ou que non. Et si je voulais faire des maths plus avancés? Par exemple, mes logistic function pour Double
nombres ressemble à ceci:
def logisticFunction(x: Double): Double = 1.0/(1.0 + math.exp(-x))
que je pouvais faire l'ajout et la division facilement (je devrais juste utiliser trait Fractional
au lieu de Numeric
), mais qu'en est-exposant? Je ne veux certainement pas écrire ma propre fonction exp
(ou toute fonction arbitraire qui prend Double
arguments). Donc, ma question est la suivante: comment puis-je convertir mon A
en Double
, faire mes calculs à ce sujet, puis revenir à A
. Est-ce même possible?
EDIT:
Voilà comment la signature de ma fonction devrait ressembler à:
def logisticFunction[A](x: A)(implicit num: Fractional[A]): A =
/* Magic happens here */
J'ai compris la partie sur la conversion de doubler, ce qui est aussi facile que num.toDouble(x)
. Cependant, le problème de la conversion à A
reste.
Le logisticFunction ne va jamais revenir un membre valide de A pour, par exemple, entier, donc non, je ne vois pas comment c'est possible à moins que vous ne vouliez commencer à l'utiliser comme une fonction partiellement appliquée et la modifier pour la comparer à des types numériques valides pour la fonction. – Shadowlands
'importer Numeric.Implicits._' et écrire' x * x' au lieu de 'num.times (x, x)'. –
Désolé de demander l'évidence, mais je suppose qu'il y a des applications plus compliquées au travail ici? Pourquoi écririez-vous ces fonctions en utilisant numérique étant donné leur simplicité? Je dis cela parce que honnêtement, vous voulez éviter la plupart des fonctionnalités de Scala pour un usage quotidien, croyez-moi sur cette beaucoup de fonctionnalités comme implicits n'ont pas leur place dans les systèmes financiers robustes. –