J'essaie de faire un compteur simple. Mes compteurs ne montent pas cependant. Il me semble que si elles sont réinitialisées à chaque fois par la fonction "INC" ou peut-être que le (n + 1) ne fonctionne pas. Comment résoudre ce problème?
4 Réponses :
dans les données HASKELL sont immuables par défaut. Cela signifie que le Pour obtenir des variables mutables dans HASKELL, vous devez leur demander explicitement em> , c'est-à-dire en utilisant iOREFS . Utilisez-les, vous pouvez écrire quelque chose comme: p> C code> in Inc code> est toujours zéro.
Merci! Ça marche. Je vais lire dessus. Un autre problème au code est que cela indique une exécution d'E.G. 2sec mais exécute 15 secondes jusqu'à ce qu'il retourne à la console :-(. Mais merci pour votre solution, c'est une bonne aide.
Iorefs ici ne sont pas idiomatiques et un mauvais style. Les variables mutables ne sont pas nécessaires pour mettre en œuvre la tâche qu'il souhaite.
Tout comme dans le code en dehors de io code>, vous pouvez organiser une série de calculs à l'aide d'un pli. FILEM code > fonctionne dans une monade, par exemple main = do
conn <- connect "192.168.35.62" 8081
let tryOnePing (c, f) i = do
p <- ping conn "ping"
return $ if p == "pong" then (c+1, f) else (c, f+1)
(c, f) <- foldM tryOnePing (0, 0) [0 .. 10000]
print (c, f)
Je suppose que Foldm Code> est au-delà de la compréhension disponible de l'OP à ce stade.
Les variables sont immuables dans HASKELLL. Lorsque vous appelez inc F code> Il renvoie une valeur de 0 + 1 code> que vous ignorez rapidement. La valeur de f code> est 0 code> et le restera pour tous les temps. P>
Bien que les variables mutables peuvent être utilisés dans Haskell comme indiqué par d'autres commentateurs, ce n'est pas un bon style: mutation ne doit pas être utilisé dans la plupart des cas
La fonction Comment écrivez-vous si aucune variable ne peut jamais être changé? La réponse est: p> Heureusement, vous avez rarement besoin d'écrire récursivité vous, comme la plupart des modèles récursifs sont déjà dans la bibliothèque standard. P> Dans votre cas, vous devez effectuer plusieurs actions IO et le retour de la finale la valeur des deux compteurs. Commençons d'une action: p> inc code> accepte son argument. valeur, qui est, elle ne modifie pas son argument. En outre, les variables déclarées par let code> garder leurs valeurs initiales, de sorte que vous ne pouvez pas les modifier. P>
main = do
conn <- connect "192.168.35.62" 8081
c <- fmap (length . filter (== "pong")) $ mapM (const $ ping conn "ping") [0 .. 10000]
print (c, 10000 - c)
Merci! À ma "défense", je dois dire que je sais sur l'immuabilité. Cependant, j'ai trouvé le "n + 1" ici: hackage.hakell.org/packages/archive/mtl/1.1.0.2/doc/html/... et ici
Merci. Au fait: lors de la synchronisation de l'extrait de réponse # 1 w iorefs, je reçois la moitié de l'exécution comparée à la synchronisation Pings <- heure (MapM Testyping [0. 1000000]) code>. Je suppose que dans le premier cas, cela n'attends pas le temps d'attente pour les réponses dans le timing. Cela pourrait-il avoir à faire avec la nature paresseuse ou pourrait-il être que cette construction iOREF s'exécute plus rapidement ??
Cela pourrait être les deux. Utilisez le profilage et / ou regarder un langage de base généré sur Haskell de niveau inférieur à voir. Utilisez également -O2 car mon code plus court dépend fortement de la présence d'optimisations.
Quant à l'état Monad que vous avez mentionné - Oui, il est là pour résoudre le problème des compteurs aussi.
Cette chose mapm, est-ce que cela sera toujours réalisable si le nombre de pings est défini sur 10 millions ou des effets, tels que la consommation de mémoire en font un choix sous-optimal?
Avec des optimisations à ce sujet devrait être réalisable. Le [0. 10000] code> Définit une énorme liste de chiffres, de sorte que tous les exemples s'appuient sur l'élimination des listes intermédiaires par Haskell Optimizer.