10
votes

Utiliser Scala, un paradigme fonctionnel a-t-il un sens pour analyser les données en direct?

Par exemple, lors de l'analyse des données en direct sur StockMarket, j'expose une méthode à mes clients xxx pré>

Les clients peuvent choisir de faire quelque chose de compter le nombre de transactions, de calculer des moyennes, de stocker des bas hauts, Comparaisons de prix et ainsi de suite. La méthode que je expose ne renvoie rien et les clients utilisent souvent des VARS et des structures mutables pour leur calcul. Par exemple, lors du calcul des transactions totales, ils peuvent faire quelque chose comme P>

var numTrades = 0

def onTrade(trade: Trade) {
    numTrades += 1
}


1 commentaires

C'est une bonne question si personnellement, j'exposerais probablement Ontrade et laissez le client choisir le niveau de fonctionnalité. Je serais intéressé d'entendre à quel point vous pouvez obtenir de cette façon fonctionnelle.


3 Réponses :


3
votes

Une possibilité utilise Monads à encapsuler l'état dans un programme purement fonctionnel. Vous pouvez consulter le bibliothèque Scalaz .

aussi, selon rapporte , l'équipe Scala développe un plug-in compilateur pour un système d'effet. Ensuite, vous pourriez envisager de fournir une interface comme celle-ci à vos clients, xxx

Les clients définissent leurs types d'entrée et de sortie A et b < / code> et définir une fonction pure f qui traite le commerce. Tous les "State" sont encapsulés dans A et B et enfilés via f .


2 commentaires

Je suppose que c'est parce que je fais Haskell plus que Scala, mais je me sens en quelque sorte comme utiliser des monades ici est aussi impératif que Ontrade . Bien que vous puissiez peut-être faire une monade personnalisée moins impérative que io (ou quoi que ce soit l'équivalent Scalaz).


Owen: Ne pensez pas au io monade, mais du haskell état monad (prudent: je veux dire état , pas St !). L'état S A A est équivalent à `s -> (a, s) '.



10
votes

Vous voudrez peut-être examiner programmation réactive fonctionnelle . En utilisant le PRF, vous exprimez vos transactions comme un flux d'événements et manipuleriez ce ruisseau dans son ensemble, plutôt que de se concentrer sur un seul échange à la fois.

Vous utiliseriez ensuite divers combinaisons pour construire de nouveaux flux, par exemple une qui retournerait le nombre de transactions ou le prix le plus élevé vu jusqu'à présent.

Le lien ci-dessus contient des liens vers plusieurs implémentations de haskell, mais il existe probablement plusieurs implémentations SCALA FRP disponibles également.


1 commentaires

Il existe deux mises en œuvre PRF principales dans Scala en cours de développement, SCALA.REACT de Ingo Maier réactif par Naftoli Gugenheim. Si vous google, vous devriez trouver des papiers et des discussions sur réagir par Ingo. Naftoli's réactif est disponible ici: Github.com/nafg/reactive Voir aussi Cette liste de diffusion thread: Scala-lang.org/node/6503



2
votes

Callbacks peut ne pas être la meilleure approche, mais il existe certainement des conceptions fonctionnelles qui peuvent résoudre un tel problème. Vous voudrez peut-être envisager une solution FRP ou une State-Monad, comme déjà suggéré, les acteurs sont une autre possibilité, comme cela constitue une forme de simultanéité Dataflow, et vous pouvez également tirer parti de la méthode copie générée automatiquement pour Cours de cas.

Une approche différente consiste à utiliser STM (mémoire transactionnelle logicielle) et coller avec le paradigme impératif tout en conservant une certaine sécurité.

L'approche meilleure dépend de la manière dont vous persistez les données et ce que vous faites réellement dans ces changements d'État. Comme toujours, laissez un profileur être votre guide si la performance est critique.


0 commentaires